Pandas调用read_csv读取TSV文件时跳过大量行的问题求助
问题原因分析及解决方案
这个问题的核心出在编码解析错误和pandas读取TSV时的行/字段解析逻辑上,咱们一步步拆解:
1. 为什么那一行会导致行数骤减?
你用了encoding='unicode_escape'来读取文件,但这个编码的作用是解析Python风格的Unicode转义序列(比如\u00fc这种写法),完全不适合读取常规的UTF-8编码文件。
问题行里的ü字符,在UTF-8编码中是两个字节:\xc3\xbc。当用unicode_escape解析时,它会把这两个字节当成普通ASCII字符处理——但这种错误解析直接打乱了pandas的字段/行识别逻辑:
- pandas默认把换行符当作行分隔符,但如果它误以为某个字段还没结束(比如编码错误导致的“假分隔符”或引号误判),就会把后续的行全部合并到当前字段里,直接导致读取的总行数大幅缩水。
- 那一行的
ü刚好触发了这个解析混乱,让pandas误以为从这一行开始的大量后续内容都是同一个字段的一部分,直到遇到某个能让它“闭合”字段的标记,才会重新开始计数行。
2. 怎么解决这个问题?
方案一:用正确的编码读取文件
首先确认你的TSV文件实际编码(大概率是UTF-8,带或不带BOM),替换encoding参数即可:
# 常规UTF-8编码文件 df = pd.read_csv(r'C:\..\file.csv', sep='\t', encoding='utf-8') # 如果是Windows下保存的带BOM的UTF-8文件,用utf-8-sig df = pd.read_csv(r'C:\..\file.csv', sep='\t', encoding='utf-8-sig')
方案二:关闭引号解析(如果字段不含引号)
如果你的数据里没有引号内容,可以关闭pandas的引号识别逻辑,避免编码错误导致的引号误判:
import csv df = pd.read_csv(r'C:\..\file.csv', sep='\t', encoding='utf-8', quoting=csv.QUOTE_NONE)
方案三:强制指定行分隔符(兜底方案)
如果上面的方法还不行,可以明确指定行分隔符(根据你的文件换行格式选\n或\r\n):
df = pd.read_csv(r'C:\..\file.csv', sep='\t', encoding='utf-8', lineterminator='\n')
验证小技巧
你可以先读取问题行附近的内容,用正确编码查看原始字符,确认是否有隐藏问题:
with open(r'C:\..\file.csv', 'r', encoding='utf-8') as f: # 替换成问题行前后的行数,比如看前10行 for _ in range(10): print(repr(f.readline()))
内容的提问来源于stack exchange,提问作者PV8
相关产品推荐
相关产品推荐

