使用pd.read_csv()读取CSV时处理坏行并留存坏行数据
解决CSV解析时自定义错误行处理函数不生效的问题
问题描述
解析包含数千行的CSV文件,该文件以逗号为分隔符、引号包裹字段,但部分行存在字段内未转义引号/逗号的格式问题。尝试使用pandas.read_csv的on_bad_lines自定义函数收集错误行,但bad_lines列表始终为空,仅能看到ParserWarning提示。
示例错误CSV内容:
"Authors","Title","ID","URN" "Overflow, Stack, Doe, John Society of overflowers "Stack" (something) ","50 years of overflowing in "Stack" : 50 years of stacking---",""117348359","URN:ND_649C52T1A9K1JJ51" "Tyson, Mike","Me boxing","525166266","URN:SD_95125N2N3523N5KB" "Smith, Garry",""Funny name" : a book about names","951992851","URN:ND_95N5J2N352BV525N25" "The club of clubs","My beloved, the "overflow stacker"","9551236651","URN:SD_955K2B61J346F1N25"
原因分析
pandas的on_bad_lines参数(python引擎下)仅针对字段数量与表头不匹配的行触发自定义函数。而字段内未转义引号导致的解析语法错误,会由解析器直接抛出警告并跳过,不会进入自定义处理逻辑,因此bad_lines始终为空。
解决方案
使用Python标准库csv先逐行解析CSV,捕获所有解析错误的行,再将有效行导入pandas:
import csv import pandas as pd # 存储错误行(行号+内容/错误信息) bad_lines = [] # 存储有效行 valid_rows = [] csv_path = "your_csv_file.csv" with open(csv_path, 'r', encoding='utf-8') as f: # 初始化CSV阅读器,指定分隔符和引号符 reader = csv.reader(f, delimiter=',', quotechar='"') # 读取表头 try: header = next(reader) valid_rows.append(header) except csv.Error as e: bad_lines.append((1, f"表头解析错误: {e}")) # 逐行处理数据 for line_num, row in enumerate(reader, start=2): try: # 验证字段数是否匹配表头 if len(row) == len(header): valid_rows.append(row) else: bad_lines.append((line_num, f"字段数不匹配,预期{len(header)}个,实际{len(row)}个,行内容: {row}")) except csv.Error as e: # 捕获解析语法错误(如未转义引号) bad_lines.append((line_num, f"解析错误: {str(e)},行内容: {row}")) # 将有效行转换为DataFrame df = pd.DataFrame(valid_rows[1:], columns=valid_rows[0]) # 查看收集到的错误行 print("错误行列表:") for line in bad_lines: print(line)
补充说明
- 如果CSV中字段内的引号是用双引号转义(符合CSV标准,如
"He said ""hello"""),可以在初始化csv.reader时添加doublequote=True参数,自动处理这类转义。 - 若需要更灵活的错误处理,可以在捕获
csv.Error时,直接读取当前行的原始内容(通过f.tell()定位后读取),方便后续手动修复。
内容的提问来源于stack exchange,提问作者Mitar Zečević
相关产品推荐
相关产品推荐

