with open()自动管理文件生命周期,退出块时必调用close(),即使异常也不会泄漏文件描述符;需指定encoding和正确路径格式防乱码与报错。

用 with open() 读文件,不手动调 close() 就不会泄漏文件描述符
Python 3.10+ 没有新语法替代 with open(),但它的可靠性比手动 open() + close() 高得多——哪怕中间抛异常,__exit__ 也会确保流关闭。漏关文件在 Linux/macOS 上可能触发 OSError: [Errno 24] Too many open files,Windows 上也可能卡住后续读写。
- 必须写成
with open("xxx.txt") as f:形式,不能拆成两行(比如先f = open(...)再with f:) -
with块退出时自动调用f.close(),哪怕里面raise ValueError也照常执行 - 如果真需要延迟关闭(极少见),得显式用
open()并自己管理生命周期,但这是反模式
读取大文件时别用 read() 一次性加载,优先选 for line in f:
read() 把整个文件塞进内存,几 GB 的日志直接 OOM;而迭代器式读取每行只保留当前行字符串,内存占用恒定。
-
for line in f:是最常用、最安全的逐行读法,自动处理换行符,line末尾带 - 想去掉换行符就写
line.rstrip(" "),别用strip()(会误删空格和制表符) - 如果要跳过空行:
if line.strip():;但注意这会把纯空白行(含空格/TAB)也过滤掉 - 二进制模式(
open(..., "rb"))下不能用for line in f:,得用for chunk in iter(lambda: f.read(8192), b""):
encoding 参数不填会出乱码,尤其 Windows 默认是 cp1252 而非 utf-8
没指定 encoding 时,Python 依赖系统 locale,Linux/macOS 通常 OK,但 Windows 记事本保存的 UTF-8 文件默认无 BOM,open("x.txt") 会按 cp1252 解码 → 中文变 ufffd 或报 UnicodeDecodeError。
- 明确写
encoding="utf-8",除非你确定文件是 GBK/ISO-8859-1 等其他编码 - 不确定编码时,用
chardet.detect()先探查,但别在热路径里调(慢),适合脚本启动时做一次 - 写文件也一样:不加
encoding可能导致中文写成乱码,且不同平台行为不一致
路径里含中文或空格?用原始字符串或正斜杠,别拼接 "C:\a\b.txt"
Windows 路径反斜杠 在普通字符串里是转义符,"C: emp est.txt" 里的 会被当 Tab 字符处理,直接报错 FileNotFoundError。
立即学习“Python免费学习笔记(深入)”;
- 写成
r"C: emp est.txt"(前面加r)或"C:/temp/test.txt"(用正斜杠,Python 全平台兼容) - 更健壮的做法是用
pathlib.Path:Path("data") / "config.json",自动处理分隔符和跨平台问题 - 避免用
"C:" + os.sep + "temp"这种写法,冗余且没解决根本问题
encoding 和路径字符串的转义问题,这两个点出错不会立刻崩溃,而是静默产生乱码或找不到文件——等数据进数据库或传给下游才暴露,排查成本远高于写的时候多敲几个字符。


















