读取FTP中含子文件夹的ZIP内CSV文件报错的排查与解决
问题原因分析
你混淆了FTP服务器的远程目录和ZIP归档内部的目录结构:
ftp.cwd('folder3')是修改FTP服务器上当前所在的文件夹,但目标CSV是存放在FTP服务器上某ZIP文件内部的子文件夹里——ZIP本身是一个独立文件,FTP服务器的目录操作根本影响不到ZIP包内部的结构,所以这个操作完全无效。- 报错本质是你尝试让pandas读取一个不存在的FTP路径(
folder3/csvFile2.csv),但这个路径是ZIP包内部的路径,并非FTP服务器上的真实文件路径。
修复方案
核心思路:先把整个ZIP文件从FTP下载到内存,再打开ZIP包读取内部指定路径的CSV文件,最后转成DataFrame。
完整修复代码示例
import ftplib import io import zipfile import pandas as pd # 1. 连接FTP服务器并将ZIP文件下载到内存缓冲区 ftp = ftplib.FTP("ftp.example.com") ftp.login("your_username", "your_password") # 替换为FTP服务器上ZIP文件的实际路径 zip_buffer = io.BytesIO() ftp.retrbinary("RETR path/to/target_file.zip", zip_buffer.write) zip_buffer.seek(0) # 重置缓冲区指针到开头,准备读取 # 2. 打开内存中的ZIP包,读取内部子文件夹里的CSV with zipfile.ZipFile(zip_buffer, 'r') as zip_ref: # 指定ZIP内部的完整文件路径 with zip_ref.open('folder3/csvFile2.csv') as csv_file: # 3. 将CSV内容转为DataFrame df = pd.read_csv(csv_file) # 验证结果 print(df.head()) ftp.quit()
关键要点说明
- 用
io.BytesIO()创建内存缓冲区,直接接收FTP下载的ZIP内容,无需写入本地磁盘。 - 通过
zipfile.ZipFile操作内存中的ZIP包,再用zip_ref.open()指定ZIP内部的完整路径读取CSV,这才是访问ZIP内子文件夹文件的正确方式。 - pandas可以直接处理
zip_ref.open()返回的类文件对象,无需额外转存。
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

