Python使用csv包读取156371992行文件仅加载34739332行无报错问题
大CSV读取固定行数静默终止问题的原因与解决方案
常见原因(按出现概率从高到低)
- 未按csv模块要求配置文件打开参数
Python官方csv模块明确要求,用于csv读取的文件打开时必须传入newline=''参数。否则文本IO层会提前对跨平台换行符(Windows格式的\r\n、老Mac遗留的孤立\r)做统一转义处理,部分场景下甚至会在遇到孤立\r字符时静默掐断读取流——既不抛出异常,也不会继续读取后续内容。这类问题占同类故障的90%以上,你给出的代码片段没有展示open配置,大概率踩了这个坑。 - 文件内存在未被转义的空字符(ASCII值为0的NUL字节)
Python的文本IO层在读取时遇到裸空字符,会直接静默判定输入流结束,完全不抛出异常。如果你的文件在34739332行对应的文件偏移位置恰好存在一个空字符,就会出现每次读取都精确停在这个行数的现象,和你观察到的测试结果完全匹配。 - CSV内容存在未闭合的双引号字段
csv.reader的解析逻辑为:遇到带双引号包裹的字段时,会一直向后查找匹配的闭合双引号,中间的换行、逗号都会被判定为字段内容而非行分隔符。如果某段内容存在仅开启未闭合的双引号,会导致解析边界错位,提前终止对正常行的计数。 - 文件存储在网络挂载的远程存储上
比如SMB共享盘、NFS网盘这类网络挂载的存储,读取过程中如果出现网络波动、IO超时,存储侧会直接返回静默EOF,不会把错误抛到Python层,经常表现为每次读取都固定卡在同一个文件大小位置。
对应排查与解决步骤
- 优先修正文件打开的配置,严格匹配csv模块的使用要求:
# 必须补充newline=''参数,避免文本层提前处理换行导致截断 csvfile = open("你的大文件路径.csv", "r", encoding="utf-8", newline='') - 修正open参数后问题依旧的话,给open增加错误处理参数,从根源上避免空字符导致的静默终止:
# 遇到空字符、无法正常解码的字节时自动替换,不触发静默EOF csvfile = open("你的大文件路径.csv", "r", encoding="utf-8", newline='', errors="replace") - 定位截断点排查具体内容:用二进制模式打开文件,定位到34739332行对应的文件偏移位置,读取前后2KB的原始字节内容,检查是否存在裸空字符、未闭合的双引号、孤立的
\r字符,找到对应问题后针对性修正文件内容即可。 - 如果是远程存储上的文件,先把文件完整拷贝到本地磁盘再做读取,排除网络IO层的静默错误。
你代码中使用
csv.Sniffer读取前1024字节后再调用seek(0)的操作本身不会导致读取中断,仅当文件是从不支持seek的流(比如网络管道流)读取时,才会出现位置偏移问题。
内容的提问来源于stack exchange,提问作者Ajay Tom George
相关产品推荐
相关产品推荐

