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

如何在Python中解码FTP retrbinary返回的bytes对象以用于Pandas读取?

我来帮你捋捋问题出在哪,以及怎么解决~

首先得指出你代码里的核心错误:你直接对filedata这个文件对象调用bytes.decode(),这完全不对——filedata是打开的文件句柄,不是字节串,肯定会触发报错。而且你当前的文件操作流程也有问题,写入后没把文件指针移回开头,就算想读文件内容也读不到。

下面给你两种可行的解决方案:


方案一:先存本地文件,再用Pandas读取路径

这是最直观的方式,先把FTP文件保存到本地,再直接传文件路径给pd.read_csv(Pandas会自动处理解码和读取):

import pandas as pd
from ftplib import FTP

def fetch_data():
    ftp = FTP('hostname')
    ftp.login('username','password')
    files = ftp.nlst()
    output = []
    
    for file in files:
        # 过滤非CSV文件,避免不必要的报错
        if not file.endswith('.csv'):
            continue
            
        file_path = f"C:/Users/USER/{file}"
        # 用with语句自动管理文件,不用手动关闭
        with open(file_path, 'wb') as filedata:
            ftp.retrbinary(f"RETR {file}", filedata.write)
        
        # 直接传本地文件路径,Pandas会自动处理解码
        # 若知道文件编码,可加encoding参数,比如encoding='utf-8'
        output_frame = pd.read_csv(file_path)
        output.append(output_frame)
    
    ftp.quit()
    return output

方案二:不存本地,直接在内存中处理(更高效)

如果不想占用本地磁盘空间,可以用io.BytesIO把FTP获取的字节数据存在内存里,直接传给Pandas:

import pandas as pd
from ftplib import FTP
import io

def fetch_data():
    ftp = FTP('hostname')
    ftp.login('username','password')
    files = ftp.nlst()
    output = []
    
    for file in files:
        if not file.endswith('.csv'):
            continue
            
        # 用BytesIO在内存中存储字节数据,模拟文件对象
        byte_buffer = io.BytesIO()
        ftp.retrbinary(f"RETR {file}", byte_buffer.write)
        
        # 把指针移回缓冲区开头,否则Pandas会读到空内容
        byte_buffer.seek(0)
        
        # 直接传入内存缓冲区,Pandas自动处理解码
        output_frame = pd.read_csv(byte_buffer, encoding='utf-8')
        output.append(output_frame)
    
    ftp.quit()
    return output

额外注意点

  • 如果你的CSV文件用了特殊编码(比如GBK、Latin-1),一定要在pd.read_csv里指定encoding参数,避免出现乱码。
  • 记得过滤FTP目录里的非CSV文件,不然会触发Pandas读取错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:40:23