如何在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
相关产品推荐
相关产品推荐

