Python 文件处理精通:摆脱常见陷阱,使用 Pathlib 与 Context Managers
Source: Dev.to
介绍
文件处理错误往往隐蔽——它们常常不会让程序崩溃,却会悄悄地损坏数据或泄漏资源。当脚本在本地机器上运行正常,却因编码不匹配或文件描述符耗尽而在服务器上失败时,这类问题尤为痛苦。掌握 Python 的文件 I/O,尤其是使用 pathlib 和 上下文管理器 等现代工具,能够让代码更可靠、跨平台。
使用 pathlib 和上下文管理器
传统做法:
f = open('file.txt')
content = f.read()
f.close()
如果在读取过程中抛出异常,文件可能无法关闭。惯用的解决方案是结合 with 上下文管理器和 pathlib,使用与操作系统无关的路径:
from pathlib import Path
file_path = Path("example.txt")
with file_path.open(encoding="utf-8") as f:
content = f.read()
print(content)
指定 encoding="utf-8" 可确保在 Windows、macOS 和 Linux 上的行为一致。
高效读取文件
对于大文件,避免一次性将全部内容加载到内存中:
with file_path.open(encoding="utf-8") as f:
for line in f:
process(line.strip())
逐行迭代可以流式处理数据,使你能够处理大于可用 RAM 的文件。
安全写入文件
始终在 with 块中打开文件,以保证刷新和关闭:
from pathlib import Path
with Path("output.txt").open("w", encoding="utf-8") as f:
f.write("Hello, Python world!\n")
如果忘记指定模式,Python 默认只读,会抛出 io.UnsupportedOperation。写入日志时使用追加模式:
with Path("log.txt").open("a", encoding="utf-8") as f:
f.write(f"Error occurred at {timestamp}\n")
处理结构化格式
CSV
使用 csv 模块而不是手动字符串分割:
import csv
from pathlib import Path
with Path("data.csv").open(encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["column_name"]) # 即使列顺序改变也能工作
newline="" 参数可防止在 Windows 上出现额外的空行。
JSON
安全地序列化和反序列化 JSON:
import json
from pathlib import Path
data = {"key": "value"}
with Path("config.json").open("w", encoding="utf-8") as f:
json.dump(data, f, indent=4) # 可读性更好的输出
常见陷阱与解决方案
| 陷阱 | 解决方案 |
|---|---|
忘记关闭文件(没有使用 with) | 始终使用上下文管理器 |
| 忽略编码 | 显式设置 encoding="utf-8" |
| 硬编码路径分隔符 | 使用 pathlib 处理跨 OS 路径 |
| 将整个大文件读取到内存 | 使用迭代流式读取(for line in f:) |
混淆文件模式(r+ 与 w) | 为操作选择正确的模式 |
进一步阅读
想了解涵盖生产环境技术、错误处理和高级工具的深入指南,请参阅 Mastering Python File I/O: How to Read and Write Files Easily。