You need to enable JavaScript to run this app. Python使用csv包读取156371992行文件仅加载34739332行无报错问题
优惠活动
大模型
产品
解决方案
定价
更多

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层,经常表现为每次读取都固定卡在同一个文件大小位置。

对应排查与解决步骤

  1. 优先修正文件打开的配置,严格匹配csv模块的使用要求:
    # 必须补充newline=''参数,避免文本层提前处理换行导致截断
    csvfile = open("你的大文件路径.csv", "r", encoding="utf-8", newline='')
    
  2. 修正open参数后问题依旧的话,给open增加错误处理参数,从根源上避免空字符导致的静默终止:
    # 遇到空字符、无法正常解码的字节时自动替换,不触发静默EOF
    csvfile = open("你的大文件路径.csv", "r", encoding="utf-8", newline='', errors="replace")
    
  3. 定位截断点排查具体内容:用二进制模式打开文件,定位到34739332行对应的文件偏移位置,读取前后2KB的原始字节内容,检查是否存在裸空字符、未闭合的双引号、孤立的\r字符,找到对应问题后针对性修正文件内容即可。
  4. 如果是远程存储上的文件,先把文件完整拷贝到本地磁盘再做读取,排除网络IO层的静默错误。

你代码中使用csv.Sniffer读取前1024字节后再调用seek(0)的操作本身不会导致读取中断,仅当文件是从不支持seek的流(比如网络管道流)读取时,才会出现位置偏移问题。

内容的提问来源于stack exchange,提问作者Ajay Tom George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 11:15:04