Python 文件处理精通:摆脱常见陷阱,使用 Pathlib 与 Context Managers

发布: (2026年1月6日 GMT+8 14:56)
4 min read
原文: Dev.to

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

Back to Blog

相关文章

阅读更多 »

Python 日志:从 print() 到生产

使用 print 的问题:python printf'Processing user {user_id}' printf'Error: {e}' 缺少的内容:- 没有时间戳 - 没有日志级别 - 没有文件输出 - Can't fil...