用 Python 读取第三方导出的订单 CSV,pandas 读出来的第一列列名是 ufeff订单号,按 df['订单号'] 取值直接 KeyError,文件在 Excel 里打开完全正常。

这类报错背后常见的原因有几处,逐个排除就行。文件以 utf-8-sig 写入,pandas 默认按 utf-8 解码;列名里混了零宽空格,肉眼看不出来;分隔符是分号而不是逗号,整行被当成一列;表头前面有空行被当成数据。

动手时先看文件头几个字节

python -c "print(open('orders.csv','rb').read(6))"

再往下改用 utf-8-sig 编码读取

python -c "import pandas as pd;d=pd.read_csv('orders.csv',encoding='utf-8-sig');print(d.columns[:3].tolist())"

随后统一去掉列名里的不可见字符

python -c "print([c.strip().replace('\ufeff','') for c in ['\ufeff订单号']])"

显式声明分隔符后再解析

python -c "import pandas as pd;print(pd.read_csv('orders.csv',sep=';',encoding='utf-8-sig').shape)"

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

恢复的判定其实很直接。列名恢复为订单号,按列取值不再抛 KeyError,行数与源文件记录数一致。

BOM 是 Excel 留下的,读取端写死 utf-8-sig 就能兼容有无 BOM 两种文件。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189