我正在尝试使用Paramiko从SFTP下载CSV文件(在内存中),并将其导入到pandas数据帧中。
transport = paramiko.Transport((server, 22))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
with open(file_name, 'wb') as fl:
sftp.getfo(file_name, fl, callback=printTotals)
df = pd.read_csv(fl, sep=' ')
下面的代码失败了,告诉我:
OSError:未打开文件进行读取
我假设我需要一些缓冲区或者像object这样的文件来代替fl
,因为open需要一个文件。我对这一切都比较陌生,所以如果有人能帮上忙,我会很高兴。
发布于 2018-05-28 13:28:24
一个仍然允许您使用进度回调的简单解决方案是:
BytesIO
file-like object将下载的文件存储到内存;使用io.BytesIO()作为fl: sftp.getfo(file_name,fl,callback=printTotals) fl.seek(0) df = pd.read_csv(fl,sep=‘')
尽管使用此解决方案,您最终会将文件加载到内存中两次。
更好的解决方案是实现一个自定义的类文件对象。它甚至允许你同时下载和解析文件。
class FileWithProgress:
def __init__(self, fl):
self.fl = fl
self.size = fl.stat().st_size
self.p = 0
def read(self, blocksize):
r = self.fl.read(blocksize)
self.p += len(r)
print(str(self.p) + " of " + str(self.size))
return r
并像这样使用它:
with sftp.open(file_name, "rb") as fl:
fl.prefetch()
df = pd.read_csv(FileWithProgress(fl), sep=' ')
有关SFTPFile.prefetch
调用,请参阅:
。
发布于 2018-05-28 20:38:06
我最终做的是一个简单的版本,不幸的是,没有对进度进行回调,我还需要rb
来阅读:
with sftp.open(file_name, 'rb') as fl:
df = pd.read_csv(fl, sep=' ')
无论如何,Martin的答案就是我想要的!
https://stackoverflow.com/questions/50531631
复制相似问题