问题现象

用 read_csv 打开运营导出的表格,前几行正常,读到中间突然抛出 UnicodeDecodeError,提示 gbk 解码失败。

原因分析

文件不是单一编码,导出工具在中文列里混入了 GBK 字节,而默认按 UTF-8 解析到那一段就断了。判断时先分清是 pandas CSV 编码 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

处理步骤

  1. 先用二进制方式读取并试探真实编码
  2. 再用 errors 参数兜底并把异常行打印出来人工核对
  3. 固定编码后写进脚本参数,不要每次手写

对应的命令或配置片段如下,可直接复制:

df = pd.read_csv('data.csv', encoding='utf-8', errors='replace')
print(df[df.isna().any(axis=1)].head())
import chardet
print(chardet.detect(open('data.csv','rb').read(200000)))

改动前把原配置备份一份,出问题时能马上回退,比现场找原因省时间。排查时把每一步的输出留下来,后面再遇到同类问题,对照日志就能判断是哪一层先出错的。

验证结果

重新执行脚本,所有行都能读出且中文列没有乱码方块,说明编码指定正确。

作者 9823189