使用pandas.read_csv时on_bad_lines未处理所有错误的原因及范围咨询
关于pandas read_csv中on_bad_lines的处理范围与格式错误解决方案
一、on_bad_lines的错误处理边界
on_bad_lines仅能处理引擎已成功解析为行对象,但行内容不符合预期的错误,比如:
- 行内字段数量与表头不匹配
- 行数据类型转换失败(部分场景)
- 行内容包含不符合规则的分隔符,但仍能被拆分成字段列表
但对于Python csv模块底层解析时触发的语法级错误,on_bad_lines无法捕获,这类错误会直接抛出_csv.Error,比如:
- 未正确闭合的引号(如你遇到的
' ' expected after '"',本质是双引号转义/闭合异常) - 非法的转义字符组合
- 破坏csv/tsv基本语法结构的格式问题
这类错误发生时,csv引擎还没把行数据传递给on_bad_lines处理函数,就已经在底层解析阶段失败了。
二、针对该TSV格式错误的解决办法
由于数据源无法修改,可通过以下方式绕过或修复格式问题:
1. 禁用引号解析
通过设置quoting参数,告诉引擎不要处理任何引号,将所有内容视为普通文本:
import pandas as pd import csv df = pd.read_csv( "NAMES_CD.TSV", sep="\t", engine="python", quoting=csv.QUOTE_NONE, chunksize=1000, on_bad_lines=bad_line_finder )
注意:如果数据中存在制表符作为字段内容的一部分,此方法可能导致字段拆分错误,但官方政府TSV通常会规范使用分隔符,这个风险较低。
2. 自定义行预处理
手动读取文件并逐行修复引号问题,再传递给pandas解析:
import pandas as pd from io import StringIO def fix_bad_quotes(line): # 示例:将未闭合的双引号补全,可根据实际错误调整逻辑 quote_count = line.count('"') if quote_count % 2 != 0: line = line.rstrip('\n') + '"\n' return line # 读取并预处理所有行 with open("NAMES_CD.TSV", 'r', encoding='utf-8') as f: fixed_content = ''.join([fix_bad_quotes(line) for line in f]) # 用预处理后的内容读取 df = pd.read_csv( StringIO(fixed_content), sep="\t", engine="python", chunksize=1000, on_bad_lines=bad_line_finder )
如果文件过大,可分块读取预处理,避免内存占用过高。
3. 调整转义字符参数
如果数据中的引号转义使用了特定字符(比如反斜杠),可指定escapechar:
pd.read_csv( "NAMES_CD.TSV", sep="\t", engine="python", escapechar='\\', chunksize=1000, on_bad_lines=bad_line_finder )
这个需要根据数据实际的转义规则调整。
内容的提问来源于stack exchange,提问作者Ray Kiddy
相关产品推荐
相关产品推荐

