如何利用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
相关产品推荐
相关产品推荐

