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

读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:39:35