我在尝试将文件从 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 模块执行此操作?我想这会更快?
提前谢谢你
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 文件中的文件名,而无需下载整个存档.