Pandas on_bad_lines参数默认行为不符预期,如何触发坏行异常?
让Pandas检测字段数不匹配的坏行并抛出异常
你遇到的问题是:默认的on_bad_line='error'不会触发字段数与表头不一致的报错——这个参数仅针对解析完全失败的行(比如引号未闭合、格式彻底错乱),而Pandas默认会自动适配字段数不匹配的行(比如把多余字段合并到最后一列),所以不会抛出异常。
要实现字段数不符时强制报错,可用以下两种方案:
方案1:兼容旧版本的error_bad_lines(Pandas < 1.3.0)
直接设置error_bad_lines=True,当行字段数与表头不匹配时会抛出异常:
from io import BytesIO import pandas as pd data = b'Name,Address,Company\nMike,"1234RdCity, State",Acme,LLC' pd.read_csv(BytesIO(data), error_bad_lines=True)
注意:该参数在Pandas 1.3.0及以上版本已被标记为废弃,推荐使用方案2。
方案2:自定义on_bad_line校验函数(推荐,全版本兼容)
先获取表头的字段数,再自定义函数检查每行的字段数量,不符则抛出异常:
from io import BytesIO import pandas as pd data = b'Name,Address,Company\nMike,"1234RdCity, State",Acme,LLC' # 先读取表头获取预期字段数 header_col_count = len(pd.read_csv(BytesIO(data), nrows=0).columns) def validate_line(line): # 按照CSV解析规则分割当前行(匹配read_csv的分隔符、引号设置) line_fields = pd.io.parsers.csv_parser.split_lines([line.decode()], sep=',', quotechar='"')[0] if len(line_fields) != header_col_count: raise ValueError(f"行字段数异常:预期{header_col_count}个,实际{len(line_fields)}个") return line pd.read_csv(BytesIO(data), on_bad_line=validate_line)
关键说明
Pandas默认不把字段数不匹配视为“坏行”,因为它会自动调整列数或合并多余字段。只有通过自定义校验逻辑,才能强制在这种场景下抛出异常。
内容的提问来源于stack exchange,提问作者Maile Cupo
相关产品推荐
相关产品推荐

