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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:05:19