如何解决pandas读取tsv文件时触发的Error tokenizing data报错?
报错根因
该解析错误是pandas默认C解析引擎的校验机制导致的:引擎读取文件时,会以第一行按分隔符切分后的字段数量作为全表的标准列数,后续任意一行切分得到的字段数和标准值不一致时,就会抛出该错误。你的报错信息明确说明:文件第一行按\t切分后仅2个字段,但第3行切分后得到4个字段,属于典型的行分隔符数量不匹配问题,诱因通常是两类:一是字段文本内容中夹带了未转义的制表符,二是文件本身存在格式错乱、表头缺失的问题。
排查方法
不要直接用pandas读取,先用原生Python逐行切分定位问题,避免直接触发报错:
# 逐行检查前10行的切分结果,定位异常 with open("something/something.tsv", "r", encoding="utf-8") as f: for line_idx, line in enumerate(f, start=1): split_res = line.rstrip("\n").split("\t") print(f"行号:{line_idx},切分后字段数:{len(split_res)},字段内容:{split_res}") if line_idx >= 10: break
执行后重点核对第3行的内容:
- 如果第3行的4个字段都是有效业务字段,说明首行表头缺列、或者前面存在无效的错乱行
- 如果第3行里多切出来的内容是某段文本的一部分,说明该字段内夹带了未被引号包裹的制表符,属于文件转义不规范
解决方案
根据排查到的问题选择对应处理方式:
- 场景1:存在少量错乱行,不需要保留异常数据
加参数让pandas自动跳过字段数不匹配的异常行即可,pandas 1.3.0及以上版本用on_bad_lines参数,旧版本用error_bad_lines=False:import pandas as pd df = pd.read_csv( "something/something.tsv", sep="\t", on_bad_lines="skip" ) - 场景2:明确知道全表的实际列数,只是部分行内容夹带未转义分隔符
手动传入列名列表,切换为容错性更高的Python解析引擎读取,不需要依赖首行判断列数:# 替换成你实际的列名 columns = ["字段1", "字段2", "字段3", "字段4"] df = pd.read_csv( "something/something.tsv", sep="\t", names=columns, engine="python" ) - 场景3:文件开头存在损坏的无效行,有效数据从中间行开始
用skiprows参数跳过前面的无效行,不自动识别表头:# 比如前2行是错乱内容,从第3行开始读取有效数据 df = pd.read_csv( "something/something.tsv", sep="\t", skiprows=2, header=None )
补充:如果排查发现文件里的分隔符不是纯制表符,存在制表符、多空格混合的情况,可以把sep参数改为正则匹配模式
sep=r"\t+",搭配Python引擎适配不规则分隔场景。
内容的提问来源于stack exchange,提问作者leskovecg
相关产品推荐
相关产品推荐

