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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:06:20