pandas 读 CSV 报 UnicodeDecodeError 通常是因为文件编码与默认 utf-8 不匹配。直接在 pd.read_csv 中指定 encoding='gbk' 或 encoding='latin-1' 参数即可解决,错误指定编码会导致读取内容乱码。
先说结论:修改 pd.read_csv 的 encoding 参数匹配文件实际编码
- 先确认报错信息中的字节位置
- 先尝试 gbk 或 latin-1 编码参数
- 再验证数据内容是否乱码
命令速用版
import pandas as pd
# 尝试 gbk 编码,适用于 Windows 生成的 CSV
df = pd.read_csv('file.csv', encoding='gbk')
# 如果 gbk 不行,尝试 latin-1 兼容所有字节
df = pd.read_csv('file.csv', encoding='latin-1')为什么会这样
pandas 的 read_csv 函数默认使用 utf-8 编码解析文件。Python 3.9 环境下字符串处理严格遵循 Unicode 标准,当 CSV 文件实际编码为 gbk、gb2312 或 cp1252 时,默认解码器遇到无法识别的字节序列就会抛出 UnicodeDecodeError。
分步处理
步骤 1:查看报错详情
读取报错信息中的 byte 位置,例如 'utf-8' codec can't decode byte 0xc4 in position 10。确认不是文件损坏导致的二进制乱码。
步骤 2:尝试常见编码
在 pd.read_csv 中添加 encoding 参数。优先尝试 encoding='gbk' 或 encoding='gb2312',这两个编码覆盖大多数中文 Windows 环境生成的 CSV 文件。
步骤 3:使用兼容编码
如果未知具体编码,使用 encoding='latin-1' 或 encoding='iso-8859-1'。这两个编码能映射所有单字节值,不会报错,但中文可能显示为乱码符号,仅适用于先读取后转换的场景。
步骤 4:自动检测编码
安装 chardet 库,运行 chardet detect file.csv 查看建议编码。将检测结果填入 pd.read_csv 的 encoding 参数。
怎么验证是否生效
代码运行不抛出 UnicodeDecodeError 异常即为初步生效。执行 print(df.head()) 检查数据内容,确认中文字符显示正常而非乱码符号。如果中文显示为问号或特殊符号,说明编码参数仍不匹配,需更换其他编码值。
常见坑
engine 参数影响:默认 engine='c' 速度快但对某些编码支持不如 engine='python'。遇到编码问题可尝试添加 engine='python' 参数,但读取大文件速度会下降。
Excel 另存为 CSV:Windows Excel 另存为 CSV 默认使用系统编码(常为 gbk)。macOS Numbers 或 Google Sheets 导出的 CSV 通常为 utf-8。不要混用编码假设。
带 BOM 的 utf-8:部分文件是 utf-8-sig 编码(带 BOM 头)。如果 encoding='utf-8' 报错,尝试 encoding='utf-8-sig' 去除字节序标记干扰。
常见问题
怎么确定 CSV 文件的具体编码?
使用 chardet 库检测或直接用文本编辑器查看。在命令行运行 pip install chardet 后,使用 chardet detect 文件名.csv 查看建议编码值。
指定 encoding 后仍然报错怎么办?
尝试添加 encoding_errors='ignore' 参数跳过错误字节。或者使用 engine='python' 参数增强兼容性,但需注意这可能会降低读取性能。
读取后中文是乱码怎么修复?
说明 encoding 参数选错了编码格式。如果当前是 latin-1 读取成功但显示乱码,需重新用 gbk 或 utf-8 读取,不能用已乱码的数据直接转换。
参考来源
- pandas 官方文档:pandas.read_csv 参数说明,https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
- Python 官方文档:Standard Encodings,https://docs.python.org/3/library/codecs.html#standard-encodings