
Python 中的 UnicodeDecodeError 通常发生在尝试用错误的编码方式读取文本时,比如用 utf-8 去解码实际是 gbk 编码的中文文件。核心思路是:**明确源数据的真实编码,并在读取时显式指定**。
确认文件真实编码
很多错误源于“默认用 utf-8”,但 Windows 记事本保存的中文文本默认是 gbk(或 gb2312),Linux/macOS 下多为 utf-8。不要猜,用工具验证:
- 用 VS Code、Notepad++ 打开文件,右下角会显示当前识别的编码
- 命令行中使用
file -i filename.txt(Linux/macOS)或chcp+ 观察控制台行为(Windows) - Python 中可尝试用
chardet库粗略检测:import chardet; print(chardet.detect(open('file.txt', 'rb').read())['encoding'])
(注意:chardet是启发式检测,不 100% 可靠,仅作参考)
读取时显式指定 encoding 参数
这是最直接有效的解决方式。避免依赖默认编码:
- 打开文件时必须写明
encoding:with open('data.txt', 'r', encoding='gbk') as f: - 常见中文编码优先级建议:
— Windows 生成的文本 → 试gbk或gb2312
— 网页抓取内容 → 查看 HTML 的<meta charset="...">或响应头Content-Type
— JSON / API 返回 → 几乎总是utf-8(但需确认文档) - 不确定时可加异常处理兜底:
try:<br> with open('f.txt', 'r', encoding='utf-8') as f: ...<br> except UnicodeDecodeError:<br> with open('f.txt', 'r', encoding='gbk') as f: ...
处理 requests 响应中的编码问题
用 requests.get() 获取网页内容时,r.text 可能乱码,因为 requests 有时自动推断错误:
立即学习“Python免费学习笔记(深入)”;
- 优先用
r.content.decode('gbk')(或你确认的编码)代替r.text - 手动覆盖响应编码:
r.encoding = 'gbk'<br> print(r.text)
- 从 HTML 中提取真正声明的编码(更可靠):
import re<br> match = re.search(r'charset=["\']?([^"\'>]+)', r.text[:500])<br> if match: r.encoding = match.group(1)
写入文件时保持编码一致
读取没问题,但写入后下次打不开?可能写入用了不同编码:
- 写入中文务必指定
encoding:with open('out.txt', 'w', encoding='utf-8') as f: - 避免跨平台混乱:统一用
utf-8写入,并在文件开头加 BOM(如需兼容旧 Windows 软件):with open('out.txt', 'w', encoding='utf-8-sig') as f: - 如果要写入
gbk文件(例如适配某国产软件),就全程用gbk读和写,不要混用










