python文件读写最推荐使用with语句,因其基于上下文管理器协议,能自动在代码块退出时(无论正常或异常)调用__exit__方法关闭文件,避免句柄泄露、内容未刷新等问题。

Python文件读写最推荐的方式是使用 with 语句,它能自动管理文件资源,确保文件在操作完成后被正确关闭,即使发生异常也不会遗漏。
为什么 with 语句更安全可靠
传统方式(如 f = open(...) 后手动 f.close())容易因忘记关闭、异常提前退出或逻辑分支跳过关闭语句,导致文件句柄泄露、内容未刷新、磁盘占用等问题。而 with 语句基于上下文管理器协议,在代码块退出时(无论正常结束还是抛出异常)都会调用 __exit__ 方法,强制关闭文件。
基础写法与常见模式
标准写法简洁明确,支持多种打开模式和编码设置:
- 读文本:
with open("data.txt", "r", encoding="utf-8") as f: content = f.read() - 写文本(覆盖):
with open("out.txt", "w", encoding="utf-8") as f: f.write("hello") - 追加文本:
with open("log.txt", "a", encoding="utf-8") as f: f.write("[INFO] done\n") - 读二进制:
with open("image.png", "rb") as f: data = f.read() - 同时读写多个文件:
with open("in.txt") as f1, open("out.txt", "w") as f2: f2.write(f1.read().upper())
避免常见误区
实际使用中要注意几个易错点:
立即学习“Python免费学习笔记(深入)”;
- 不要在 with 块外使用文件对象,如
with open(...) as f: pass; f.read()会报ValueError: I/O operation on closed file - 写入中文等非ASCII内容时,务必显式指定
encoding="utf-8",否则可能在Windows上默认用gbk编码导致乱码或报错 - 不建议嵌套多层 with(如先 open A 再在内部 open B),应改用逗号分隔的单个 with,更清晰且保证全部资源被释放
- 若需控制缓冲行为(如实时写入日志),可在 open 中加
buffering=1(行缓冲)或flush=True配合f.write()
进阶:自定义上下文管理器处理特殊需求
当标准 open 不够用(例如需要自动解压、远程读取、带重试的网络文件),可封装成上下文管理器。例如:
(简化示意)
from contextlib import contextmanager
@contextmanager
def open_gz(filename):
import gzip
f = gzip.open(filename, "rt", encoding="utf-8")
try:
yield f
finally:
f.close()
<h1>使用方式一致</h1><p>with open_gz("data.json.gz") as f:
data = json.load(f)
这样既保持了 with 的安全性和可读性,又扩展了能力边界。










