使用 Python ftplib 从 FTP 将 CSV 文件读取到 Pandas 数据帧

问题描述 投票:0回答:1

我在尝试将文件从 FTP 服务器下载到 Pandas 数据框时出现 “[Errno 2] 没有这样的文件或目录” 错误。这些文件位于 FTP 的根目录中。

我猜

pd.read_csv()
函数正在查看我的本地文件系统......即脚本所在的本地路径......但我不知道如何改变它。

def fetch_files(site, username, password, directory: str = '/', filematch: str = '*.csv'):
    with ftplib.FTP(site) as ftp:
        # pass the url without protocol
        ftp = ftplib.FTP(site)
        # pass credentials if anonymous access is not allowed
        ftp.login(username, password)
        ftp.cwd(directory)
        list_ = []
        for file_ in ftp.nlst(filematch):
            print(file_) # This works
            df = pd.read_csv(file_, index_col=None, header=0) # This fails
            list_.append(df)

或者我必须使用

ftp.retrlines()
方法吗?如果是这样,
LIST
MLSD
参数有什么区别?

附带说明:CSV 中的文件中包含 HTML 代码,例如

&
,它破坏了 SQL 批量插入。这就是我将它们读取到数据帧的原因是更改编码并合并各个文件。有没有更快的方法直接通过 Python csv 模块执行此操作?我想这会更快?

提前谢谢你

python pandas csv ftp ftplib
1个回答
1
投票

使用

FTP.retrbinary
BytesIO
将文件下载到内存,然后将内存中的类文件对象传递给
read_csv

flo = BytesIO()
ftp.retrbinary('RETR ' + file_, flo.write)
flo.seek(0)
pd.read_csv(flo, ...)

类似问题:Reading files from FTP server to DataFrame in Python


上面将整个 CSV 文件加载到内存中,然后才会对其进行解析。如果您想在下载文件时对其进行处理,则可能需要实现一个智能的自定义类文件对象。什么不容易。

对于做类似事情的问题,请参阅我的回答:
获取 FTP 服务器上 zip 文件中的文件名,而无需下载整个存档.

© www.soinside.com 2019 - 2024. All rights reserved.