open()默认只读模式,写操作需显式指定'w'或'a'等模式,路径用正斜杠或原始字符串,必须指定encoding参数,资源管理推荐with语句。

open() 函数默认是只读模式,不加参数就报错写操作
很多人一上来就 open('data.txt', 'w').write('hi'),发现文件空了却没报错;或者用 open('data.txt') 直接调 .write(),结果抛出 io.UnsupportedOperation: not writable。这是因为 open() 默认模式是 'r'(只读),任何写入都会失败。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 显式写出模式,别依赖默认值——
open('log.txt', 'a')比open('log.txt')更安全、更可读 -
'w'会清空原文件,'a'才是“追加”的真实含义:光标自动移到末尾,且不会覆盖已有内容 - 二进制模式必须显式声明:
'rb'/'wb',混用文本和二进制模式(比如用'w'写 bytes)会直接报TypeError
中文路径或含空格的文件名导致 FileNotFoundError
在 Windows 上用 open('C:\Users\name\文档\test.txt') 经常报错,不是因为路径不存在,而是反斜杠 \ 被当转义字符处理了——\d、\t 都会被解释成特殊字符,最终路径根本不对。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 统一用正斜杠:
open('C:/Users/name/文档/test.txt'),Python 全平台兼容 - 或用原始字符串:
open(r'C:\Users\name\文档\test.txt'),开头加r - 路径拼接别手拼,用
os.path.join()或更推荐的pathlib.Path():Path('data') / 'raw' / 'input.csv'
忘记 close() 或异常后文件句柄泄漏的真实影响
你可能试过 f = open('x.log'); f.write('ok'); f.close(),但一旦中间出错(比如磁盘满、权限不足),f.close() 就不会执行。后果不是“文件打不开”,而是系统级资源耗尽:Linux 下单进程默认最多打开 1024 个文件,开几百个没关的 open(),后续所有 open() 都会报 OSError: [Errno 24] Too many open files。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 无条件用
with open(...)语句,哪怕只是读一行:with open('cfg.json') as f: data = json.load(f) - 不要在函数里返回
open()返回的文件对象让调用方关——责任边界模糊,极易漏关 - 调试时怀疑句柄泄漏,Linux/macOS 可用
lsof -p $(pgrep -f your_script.py)查看进程打开了哪些文件
编码错误:UnicodeDecodeError 和乱码的根本区别
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 这类报错,90% 是因为用系统默认编码(Windows 是 gbk)去读一个 UTF-8 编码的文件。反过来,用 UTF-8 写中文到文件,却不声明 encoding='utf-8',在某些环境(比如旧版 IDLE 或某些终端)里会静默失败或输出乱码。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 只要文件含中文或非 ASCII 字符,
open()必须带encoding参数:open('notes.txt', encoding='utf-8') - 写文件时也指定编码,避免依赖 locale:
open('out.csv', 'w', encoding='utf-8-sig')(-sig防 Excel 打开乱码) - 不确定源文件编码?先用
chardet库探测:chardet.detect(open('old.txt', 'rb').read())['encoding']
文件操作看着简单,但编码、路径、资源管理、模式语义这四块,每一块都卡在“运行时不报错,行为不符合预期”的灰色地带。尤其在跨平台协作或部署到服务器时,这些点比语法错误更难定位。










