python open()函数四大坑:一不指定encoding易乱码,须显式设utf-8;二'w'模式会清空文件,追加用'a';三忘close致资源泄漏,应使用with语句;四路径拼接错误,推荐pathlib.path构建。

Python 的 open() 函数看似简单,但实际使用中容易因编码、路径、模式、资源释放等问题引发异常或数据损坏。关键在于理解它默认行为的“隐含假设”,而不是把它当作黑盒调用。
坑一:不指定 encoding,读写中文直接乱码
在 Windows 上用默认方式打开含中文的文件,常报 UnicodeDecodeError;Linux/macOS 有时看似正常,实则依赖系统 locale,跨平台极易出错。
解决方法:
- 显式传入
encoding='utf-8'(推荐 UTF-8,除非明确知道是 GBK/GB2312 等) - 写文件时也加 encoding,避免用系统默认编码写入后被其他程序读错
- 不确定编码时,可用
chardet或charset-normalizer库先探测
坑二:用 'w' 模式打开文件,误删原内容
open('file.txt', 'w') 会清空文件再写入——哪怕你只写一行,整个文件就只剩那一行。很多人想“追加一行”却用了 'w',结果丢了全部历史数据。
解决方法:
- 追加内容用
'a'(append)模式,它自动定位到文件末尾 - 想“读+写”且保留原内容,用
'r+'或'w+'(注意:'w+'仍会清空!) - 保险做法:先读取原内容(
'r'),处理后再用'w'写回,或用临时文件 + 原子替换
坑三:忘记 close(),导致文件句柄泄漏或内容未写入
手动调用 f.close() 容易遗漏,尤其在异常路径下;而且 close() 前若没 flush(),缓冲区内容可能滞留内存,程序退出前丢失。
解决方法:
- 坚持用
with open(...) as f:语法,退出作用域自动安全关闭 - 需要立即落盘时(如日志、关键配置),在
with块内调用f.flush() - 避免在循环里反复
open/close同一文件,应在外层打开,循环内操作
坑四:路径拼接错误,文件找不到(FileNotFoundError)
用 './data/file.txt' 或 'data\file.txt' 硬编码路径,在不同系统或工作目录下极易失败;相对路径依赖当前工作目录(os.getcwd()),而非脚本所在目录。
解决方法:
- 用
pathlib.Path构建路径:Path(__file__).parent / 'data' / 'file.txt' - 或用
os.path.join()替代字符串拼接 - 打开前用
path.exists()或os.path.isfile()预检,给出清晰提示而非让open抛异常
不复杂但容易忽略。把 encoding、mode、with 和路径这四点理清楚,90% 的 open 问题就消除了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











