写Python脚本时,遇到中文显示乱码,文件读取报错,这种问题太常见了。尤其是处理配置文件、日志或爬虫抓取网页时,一碰到非ASCII字符就出问题,让人头疼。
为什么会出现编码问题?
Python 3 默认使用 UTF-8 编码,但有些文本文件是用 GBK、GB2312 或其他编码保存的,比如Windows记事本默认存的中文文本。脚本一读,编码对不上,自然就乱码了。另外,服务器环境、编辑器设置、甚至终端输出也会影响编码表现。
查看文件实际编码
别急着改代码,先确认文件到底是什么编码。可以用 Python 的 chardet 库探测:
import chardet
with open('data.txt', 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
print(result)
输出可能是 {'encoding': 'GBK', 'confidence': 0.99},这就告诉你该用什么编码打开。
正确打开中文文件
知道编码后,打开文件时显式指定 encoding 参数:
with open('data.txt', encoding='utf-8') as f:
content = f.read()
如果是 GBK 编码的文件,改成 encoding='gbk' 就行。这样读出来的中文就不会变成“涓枃”或者抛出 UnicodeDecodeError 了。
脚本中包含中文字符串
老版本 Python 2 需要在文件开头加声明:
# -*- coding: utf-8 -*-
Python 3 已经默认支持 UTF-8,一般不用加。但如果在某些旧环境运行,加上更保险。
处理网络请求中的编码
用 requests 爬网页时,有时 resp.text 还是乱码。可以手动指定编码:
import requests
resp = requests.get('https://example.com')
resp.encoding = 'utf-8' # 或 gbk,视网页而定
print(resp.text)
也可以直接用 resp.content.decode('gbk') 来解码原始字节。
避免路径中的中文问题
脚本处理带中文的文件路径,在 Windows 上容易出错。确保路径字符串是 Unicode,Python 3 通常没问题。如果传给 subprocess 调用外部命令,注意命令行环境是否支持 UTF-8。
统一项目编码规范
最省心的办法是整个项目都用 UTF-8。编辑器保存文件时选 UTF-8 无 BOM 格式,配置文件、日志输出、数据库连接都统一设定。团队协作时尤其重要,避免有人用记事本乱改编码。
编码问题看着小,出一次就够折腾半天。提前设好 encoding,读文件前查一下真实编码,大部分坑都能绕开。