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

Pandas read_csv()读取不足200行的FTP下载CSV文件时报错

结论

这不是Pandas的固有bug,是你的代码存在逻辑错误。


根本原因

你将pd.read_csv()调用放在了文件写入的上下文管理器(with open(...)块)内部,此时FTP下载的二进制内容还未完全从缓冲区刷入磁盘、文件句柄也未正常关闭,读取操作触发时文件内容是不完整的。

这个问题只在小文件场景复现、大文件场景正常的原因非常明确:

  • 大文件体积大,retrbinary触发多次写入回调,缓冲区会被多次填满自动刷盘,等你执行read_csv时,文件里已经写入了足够解析的表头和数据内容,不会触发解析错误
  • 小文件体积太小,整个下载写入过程极快,你触发读取时缓冲区的内容还没落到磁盘上,文件要么是空的,要么只有残缺的片段,Pandas解析不到合法列,就会抛出No columns to parse from file错误。

另外你贴的示例数据还存在两个潜在的解析风险,会放大小文件场景的报错概率:

  • 数据行引号不配对:示例行"8481832";2022-30-06";GFBG21";4,00中,日期字段、第三个字段开头缺失前双引号,属于格式不规范
  • 数值用逗号做小数分隔符:4,00这类格式默认会被Pandas识别为字符串而非数值

修复代码
  1. 首先调整代码执行顺序,等文件完全写入、关闭后再执行读取操作,不要把read_csv写在with写入块内部
  2. 补充read_csv的参数适配你的文件格式,减少解析容错问题
import os
import pandas as pd

# 先完成FTP下载写入
with open(csv_filename, 'wb') as file:
    ftp.retrbinary(f"RETR {csv_filename}", file.write)
    # 小文件场景可以加强制刷盘,避免操作系统级别的缓冲区延迟
    file.flush()
    os.fsync(file.fileno())

# 文件完全落盘后再执行读取
file_data = pd.read_csv(
    csv_filename,
    sep=';',
    header=0,
    quotechar='"',
    decimal=','
)

排查验证

如果调整后仍有报错,可以在read_csv前加两行校验代码,确认读取时的文件状态:

print(f"当前文件大小:{os.path.getsize(csv_filename)} 字节")
with open(csv_filename, 'rb') as f:
    print(f"文件头部200字节内容:{f.read(200)}")

如果打印出来的文件大小为0,或者头部内容没有完整的表头行,就说明是下载写入流程的时序问题导致的。


内容的提问来源于stack exchange,提问作者Jordy V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:39:03