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

如何利用pandas的on_bad_lines将CSV无效行写入文件?

如何捕获并保存CSV中列数不一致的无效行

你在解析CSV时遇到部分行列数不符的问题,比如这类示例行:

001;Snow,Jon;19801201
002;Crom,Jake;19920103
003; ;Wise,Frank;19880303   <-- Invalid row
004;Wiseau,Tommy;4324;1323;2323  <-- Invalid row

想要把这些无效行单独存入文本文件,而不是只跳过或仅收到警告,这里有两种实用方案:

方案1:逐行读取手动筛选

直接遍历原始文件,按有效列数判断,不符合的写入错误文件,全程可控:

# 设定正常行的列数(示例中有效行是3列)
expected_cols = 3
input_path = 'names.csv'
error_path = 'invalid_rows.txt'

with open(input_path, 'r', encoding='utf-8') as infile, open(error_path, 'w', encoding='utf-8') as errfile:
    for line_num, line in enumerate(infile, start=1):
        # 分割列并去除行尾换行
        cols = line.strip().split(';')
        if len(cols) != expected_cols:
            # 写入错误文件时附带行号,方便定位问题
            errfile.write(f"行号 {line_num}: {line}")
        # 有效行可按需存入DataFrame或做其他处理

方案2:用pandas自定义错误行处理函数

如果继续用pandas处理有效数据,可通过on_bad_lines参数传入自定义函数,捕获无效行并写入文件:

import pandas as pd

error_path = 'invalid_rows.txt'

def process_bad_line(line_content, line_number):
    # 将行内容还原为原始格式,追加写入错误文件
    with open(error_path, 'a', encoding='utf-8') as errfile:
        errfile.write(f"行号 {line_number}: {';'.join(line_content)}\n")
    # 返回None让pandas跳过该行
    return None

# 读取CSV并应用自定义处理逻辑
df = pd.read_csv('names.csv', header=None, sep=';', on_bad_lines=process_bad_line)

两种方案各有侧重:方案1适合不需要pandas的场景,完全掌控读取流程;方案2适合继续用pandas处理有效数据的需求,同时收集无效行。

内容的提问来源于stack exchange,提问作者GrrHackPrecioussss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:10:33