luk*_*s_o 5 python io sftp paramiko pandas
我正在尝试使用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=' ')
Run Code Online (Sandbox Code Playgroud)
下面的代码失败,告诉我:
OSError:文件未打开以供读取
我假设我需要某种缓冲区或类似对象的文件fl,因为open需要一个文件。我对这一切还比较陌生,所以如果有人可以帮忙,我会很高兴。
一个仍然允许您使用进度回调的简单解决方案是:
BytesIO类似文件的对象将下载的文件存储到内存中;with io.BytesIO() as fl:
sftp.getfo(file_name, fl, callback=printTotals)
fl.seek(0)
df = pd.read_csv(fl, sep=' ')
Run Code Online (Sandbox Code Playgroud)
尽管使用此解决方案,您最终将文件两次加载到内存中。
更好的解决方案是实现类似文件的对象。它甚至可以让您同时下载和解析文件。
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
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
with sftp.open(file_name, "rb") as fl:
fl.prefetch()
df = pd.read_csv(FileWithProgress(fl), sep=' ')
Run Code Online (Sandbox Code Playgroud)
有关该SFTPFile.prefetch调用的信息,请参见:
读取使用Python Paramiko SFTPClient.open方法打开的文件为slow。
| 归档时间: |
|
| 查看次数: |
1902 次 |
| 最近记录: |