Python UnicodeDecodeError 解决方案

4次阅读

Python UnicodeDecodeError 解决方案

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 生成的文本 → 试 gbkgb2312
    — 网页抓取内容 → 查看 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 读和写,不要混用

text=ZqhQzanResources