应显式指定 encoding='utf-8-sig' 以兼容带 bom 的 utf-8 文件,避免 unicodedecodeerror;open() 在 python 3 中虽可省略 encoding,但会回退到系统 locale 编码(如 windows 的 cp936),导致跨平台读写失败,务必明确指定 encoding 参数。

打开文件时提示 UnicodeDecodeError 怎么办
根本原因不是没加 encoding='utf-8',而是系统默认编码和文件实际编码不一致。Windows 上很多编辑器(比如记事本)保存 UTF-8 时会带 BOM,而 Python 默认用 utf-8 解码——它不认 BOM,但也不报错;可一旦文件是 utf-8-sig 编码(即带 BOM 的 UTF-8),就必须显式指定,否则读取中文会崩。
- 错误现象:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte - 实操建议:优先试
encoding='utf-8-sig',它能自动跳过 BOM,兼容性比纯utf-8更强 - 别硬套“UTF-8 就该用
utf-8”,要看文件真实编码——用 VS Code 右下角看,或命令行file -i filename.py(Linux/macOS)
open() 的 encoding 参数必须写吗
Python 3 中,open() 读文本文件时 encoding 是必填项——只是解释器会 fallback 到 locale.getpreferredencoding(False),也就是系统 locale 编码。你没写,不代表没用编码,只是用了个不可控的值。
- Windows 中文系统 fallback 是
cp936(GBK),读 UTF-8 文件大概率报错 - Linux/macOS 多数是
utf-8,看似没问题,但一换环境就翻车 - 明确写上
encoding='utf-8'或encoding='utf-8-sig'才算真正跨平台可靠 - 二进制模式(
'rb')不用设encoding,但后续要自己解码,反而更易出错
用 pandas.read_csv() 读中文 CSV 报编码错
它底层也调 open(),但默认不传 encoding,且 fallback 行为跟 Python 原生不完全一致——尤其在 Windows 上容易卡在 gbk 和 utf-8 之间反复横跳。
- 常见错误:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 10 - 直接加参数:
pandas.read_csv('data.csv', encoding='utf-8-sig') - 如果还不行,先用
chardet库探一下:chardet.detect(open('data.csv', 'rb').read(10000)) - 注意:
encoding不支持缩写,'utf8'会报错,必须写全'utf-8'
写文件时要不要也设 encoding
要。虽然写入时 Python 通常不会当场报错,但不设的话,Python 会用 locale 编码写,导致别人(或你自己换个系统)读的时候以为是 UTF-8,结果全是乱码。
- 写脚本生成配置、日志、导出数据时,务必统一用
encoding='utf-8' - 用
print(..., file=f)写入时,f必须是带encoding打开的文本文件,不能是'wb'模式再手动 encode - 一个容易被忽略的点:Jupyter Notebook 里
%save或自动保存的 .py 文件,可能按 notebook 设置的编码保存,跟你的open()不一致
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











