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识别为字符串而非数值
修复代码
- 首先调整代码执行顺序,等文件完全写入、关闭后再执行读取操作,不要把read_csv写在with写入块内部
- 补充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
相关产品推荐
相关产品推荐

