先把当时的情况摆出来。pandas 2.2 读一个 3GB 的导出 CSV,跑到 120 万行左右抛 ParserError: Error tokenizing data,用 Excel 打开正常,换 engine=python 更慢但仍失败。
把日志和配置对完,能解释这个现象的基本就这几处。字段里有未转义的双引号,解析器把后面多行吞进一个字段。还有一种是分隔符不是纯逗号,某列内容里带了分号。
还有一种情况,文件编码混用,gbk 段落里出现 0x22。另外,行尾是 CR 单独出现,被当成记录结束。
定位报错行号并打印上下文
python -c "import pandas as pd;print(pd.read_csv('big.csv',nrows=5,on_bad_lines='warn'))"
接着用 csv 模块逐行扫一遍引号计数
python -c "import csv;r=csv.reader(open('big.csv',encoding='utf-8',errors='replace'));print(sum(1 for _ in r))"
再往下统一转成 utf-8 并用严格引号规则重读
python -c "import pandas as pd;df=pd.read_csv('big_u8.csv',quotechar='\"',quoting=csv.QUOTE_MINIMAL);print(len(df))"
末了按分块读取把坏行单独落盘
python -c "import pandas as pd;[print(len(c)) for c in pd.read_csv('big.csv',chunksize=100000,on_bad_lines='skip')]"
别只看报错消失,验证要多做一步。全量读取成功且行数与源文件记录数一致,坏行清单里只剩确实残缺的几条,字段列数与表头匹配。
提醒一点。解析类报错先定位具体行再谈参数,on_bad_lines 只是把问题藏起来,引号和编码两个根因不解决,抽样结果仍然会偏。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
