真正有效的异常恢复靠设计阶段的容错机制:写入前备份原文件、用临时文件+原子重命名、具体捕获异常、配合上下文管理器与校验。

Python 文件操作中遇到异常或程序意外中断时,数据丢失和文件损坏是常见问题。关键不是“能不能恢复”,而是“有没有提前做保护”。真正有效的异常恢复,靠的是设计阶段的容错机制,而不是事后补救。
写入前先备份原文件
对重要文件进行修改前,把原始内容复制一份,是最简单也最可靠的兜底方式。即使写入中途崩溃,原始文件依然完好。
- 用 shutil.copy2() 复制,保留时间戳和权限信息
- 备份名建议加时间戳或
.bak后缀,避免覆盖 - 写入成功后再删除备份;失败则自动还原(需在
except块中处理)
用临时文件 + 原子重命名保障完整性
直接写原文件风险高,推荐“先写临时文件、再替换”的模式。操作系统对 os.replace()(或 os.rename())的执行是原子的,不会出现“半新半旧”状态。
- 生成临时文件路径:用 tempfile.NamedTemporaryFile(delete=False) 或手动拼接
xxx.tmp - 所有写入操作针对临时文件,完成后调用 os.replace(tmp_path, original_path)
- 若写入失败,临时文件可安全丢弃,不影响原文件
异常捕获要具体,别只写 except:
裸 except: 会吞掉 KeyboardInterrupt、SystemExit 等关键信号,导致无法正常中断。同时,不同错误需要不同应对策略。
立即学习“Python免费学习笔记(深入)”;
- 捕获 IOError 和 OSError 处理磁盘满、权限不足等系统级问题
- 用 except (OSError, IOError) as e: 统一处理底层 I/O 异常
- 单独处理 KeyboardInterrupt,做清理后优雅退出(如删临时文件、关句柄)
上下文管理器(with)不是万能的
with open(...) 能确保文件关闭,但不保证写入完成或内容正确。如果写入中途崩溃,文件可能被截断或残留脏数据。
-
with只管资源释放,不管业务逻辑完整性 - 仍需配合临时文件、校验(如写入后读回比对)、或 checksum 校验
- 对大文件写入,考虑分块 + 断点续传逻辑(记录已处理位置)
不复杂但容易忽略:恢复能力不在出事之后,而在打开文件那一行代码之前就埋好了伏笔。










