为什么编号会读错

订单号和地区编码可能看起来像数字,但它们承担的是标识作用。“00123”和“123”不一定代表同一个编号。读取 CSV 后如果直接转换为整数,前导零就无法保留。下面先用内存中的小样本验证读取方法,避免影响真实资料。

运行一个最小样本

import csv
import io
sample = 'code,name\n00123,"资料,入门"\n'
rows = list(csv.DictReader(io.StringIO(sample)))
assert rows[0]['code'] == '00123'
assert rows[0]['name'] == '资料,入门'
print(rows[0]['code'], rows[0]['name'])

预期输出的编号仍为 00123,名称中的逗号不会被当作新的列分隔符。不要使用简单的 split(',') 替代 CSV 解析器,因为引号中的逗号也可能属于字段内容。

处理真实文件

先复制一份待处理文件,并确认它的编码、分隔符和列名。使用 open 读取 CSV 时,按实际编码设置 encoding,并使用 newline='';如果来源明确为带 BOM 的 UTF-8,可选 utf-8-sig。编码选错导致的乱码不能靠给编号补零来解决。

核对结果

分别检查首尾记录、包含引号的字段和不同长度的编号,确认行数及列名符合预期。把标识字段一直保留为字符串,仅对明确需要计算的字段进行数值转换。本方法不推断缺失编号,也不会恢复上游已经删除的前导零。

参考资料