如何使用pandas DataFrame追踪定位TSV文件导入后的数据错误?
解决方法
你遇到的是TSV单行字段数超出表头定义列数的异常检测问题,默认pd.read_csv遇到这类行时会直接抛出解析错误,无法直接用shape属性检测行内多余值,可以通过以下两种方案实现需求:
方案1:预扫描原始TSV文件检测(推荐,可直接获取原始行号、完整异常内容)
先不通过pandas读入,直接逐行读取原始文件,对比每行的字段数和表头定义的预期字段数,直接收集异常信息:
import pandas as pd input_file = "你的目标TSV文件路径" bad_records = [] # 先读取表头确定预期列数 with open(input_file, 'r', encoding='utf-8') as f: header_line = f.readline().strip() expected_cols = len(header_line.split('\t')) # 逐行校验剩余内容 for line_num, content in enumerate(f, start=2): # 行号从2开始计数,表头为第1行 content = content.strip() if not content: continue current_cols = len(content.split('\t')) if current_cols > expected_cols: extra_values = content.split('\t')[expected_cols:] bad_records.append({ "异常行号": line_num, "原始行内容": content, "多余值列表": extra_values })
运行完成后bad_records会存储所有存在多余值的行的完整信息,可直接打印或导出为校验报告。
方案2:读入DataFrame时同步捕获异常
如果需要同时正常导入有效数据到DataFrame,可以自定义异常行处理函数,通过on_bad_lines参数传入pd.read_csv:
bad_records = [] expected_cols = 3 # 你的预定义列数,这里示例是3列 def catch_bad_line(line: list): # line为当前异常行拆分后的所有字段列表 extra_values = line[expected_cols:] bad_records.append({ "原始字段列表": line, "多余值列表": extra_values }) # 返回前N个有效字段,该行会正常加入DataFrame;返回None则跳过该行 return line[:expected_cols] df = pd.read_csv( input_file, delimiter='\t', header=0, encoding='utf-8', on_bad_lines=catch_bad_line )
运行完成后df为清洗后的标准DataFrame,bad_records存储所有异常信息。
内容的提问来源于stack exchange,提问作者Elle
相关产品推荐
相关产品推荐

