gpt4 book ai didi

python - 如何使用Paramiko getfo从SFTP服务器下载文件到内存进行处理

转载 作者:太空狗 更新时间:2023-10-30 00:53:08 24 4
gpt4 key购买 nike

我正在尝试使用 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: File is not open for reading

我假设我需要某种缓冲区或文件之类的 fl 对象,因为 open 需要一个文件。我对所有这一切都比较陌生,所以如果有人能提供帮助,我会很高兴。

最佳答案

仍然允许您使用进度回调的简单解决方案是:

  • 使用 BytesIO file-like object将下载的文件存储到内存中;

  • 下载文件后,您必须在开始阅读文件之前将文件指针找回到文件开始。

    with io.BytesIO() as 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调用,引用:
Reading file opened with Python Paramiko SFTPClient.open method is slow
.


如果你不需要进度监控,像这样的简单代码就可以了:

with sftp.open(file_name, "rb") as fl:
fl.prefetch()
df = pd.read_csv(fl, sep=' ')

关于python - 如何使用Paramiko getfo从SFTP服务器下载文件到内存进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com