导入报 缺少字段 id,把表头打印出来是 ['\ufeffid', 'name'],肉眼看第一个字段就是 id,用 == 比较却永远不相等。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
with open(path, encoding='utf-8-sig', newline='') as f:
header = next(csv.reader(f))
print(repr(header[0]))
Excel 另存 CSV 时加了 UTF-8 BOM,用 utf-8 解码后这三个字节留在第一个字段名前面。表头映射按精确字符串匹配,带不可见字符的键对不上。这一点先确认清楚,后面就不用反复试。
「CSV BOM 表头」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
具体做法是,打开文件时用 encoding='utf-8-sig' 让解码器吃掉 BOM;历史文件已经在用 utf-8 读的 对首列做 lstrip('\ufeff');映射前统一 strip 并打印 repr 确认没有隐藏字符。
改完照着核一遍,表头打印出来是 'id',导入不再提示缺字段,首列数据正常写入。
