You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:43:11