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

为何pd.read_csv读取TSV末尾换行符时会将其识别为NaN值?

问题原因

skip_blank_lines=True的判定逻辑是仅跳过完全没有任何非空白字符、也不包含分隔符的纯空行。你遇到的读取到全NaN行,大概率是两种情况:

  • 生成的TSV文件末尾除了要求的1个换行符外,额外残留了制表符(分隔符),这一行会被识别为和你数据列数一致的空字段行,读取后全部填充为NaN
  • 生成文件时实际多输出了1个换行符,末尾额外多了一行空行,被识别为有效行读取

你当前使用的df.dropna(how="any", inplace=False)方案存在缺陷:如果你的正常业务数据里存在合法的空值字段,会被误删,造成数据丢失。

更优解决方案

你可以根据自己的场景选择以下方案:

  • 读取后仅删除全空行
    把dropna的判定条件从any改为all,只会删除所有字段均为NaN的行,不会影响带合法空值的正常数据:
    df_no_nan = df.dropna(how="all", inplace=False)
    
  • 读取时直接跳过最后一行
    如果你确认只有文件末尾的一行会出现全NaN的情况,可以在读取时直接用skipfooter参数跳过最后一行,注意该参数需要搭配Python解析引擎使用:
    my_df = pd.read_csv('my.tsv', delimiter='\t', skip_blank_lines=True, skipfooter=1, engine='python')
    
  • 从根源处理文件末尾换行
    如果确认文件仅末尾多了一个换行符,可以先读取文件内容去掉末尾多余换行再传给pandas解析,避免读到额外行:
    with open('my.tsv', 'r', encoding='utf-8') as f:
        content = f.read().rstrip('\n')
    my_df = pd.read_csv(pd.io.common.StringIO(content), delimiter='\t', skip_blank_lines=True)
    

如果要从根源避免这个问题,你可以在生成TSV文件时,确保最后一行数据末尾只加1个换行符,不要额外添加制表符或多余换行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:54:07