Python 3.9 pandas 读 CSV 报 UnicodeDecodeError 错怎么解决

文章导读
pandas 读 CSV 报 UnicodeDecodeError 通常是因为文件编码与默认 utf-8 不匹配。直接在 pd.read_csv 中指定 encoding='gbk' 或 encoding='latin-1' 参数即可解决,错误指定编码会导致读取内容乱码。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 文件。

Python 3.9 pandas 读 CSV 报 UnicodeDecodeError 错怎么解决

步骤 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。不要混用编码假设。

Python 3.9 pandas 读 CSV 报 UnicodeDecodeError 错怎么解决

带 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