为何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
相关产品推荐
相关产品推荐

