我得到一个"[Ernno2]没有这样的文件或目录">尝试将文件从FTP服务器下载到Pandas数据帧时出错。这些文件位于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, ...)
类似的问题:在Python 中从FTP服务器读取文件到DataFrame
上面的操作将整个CSV文件加载到内存中,然后它才会解析它。如果你想在下载文件时解析它,那可能需要实现一个类似智能自定义文件的对象。什么是不容易的。
对于类似的问题,请参阅我的回答:
在FTP服务器上获取zip文件中的文件名,而无需下载整个归档文件。
尽管pandas.read_csv
文档声称它直接支持FTP
所以这也应该起作用:
pd.read_csv("ftp://username:password@example.com/remote/path/" + file_)