首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Paramiko getfo将文件从SFTP服务器下载到内存进行处理

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

Stack Overflow用户
提问于 2018-05-25 22:35:10
回答 2查看 6.3K关注 0票数 10

我正在尝试使用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需要一个文件。我对这一切都比较陌生,所以如果有人能帮上忙,我会很高兴。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-28 13:28:24

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

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

使用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调用,请参阅:

票数 12
EN

Stack Overflow用户

发布于 2018-05-28 20:38:06

我最终做的是一个简单的版本,不幸的是,没有对进度进行回调,我还需要rb来阅读:

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

无论如何,Martin的答案就是我想要的!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50531631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档