使用Python解压缩SFTP服务器上的文件



我有一个zip文件,它存在于SFTP服务器上。我正在编写一个AWS lambda函数,并使用Paramiko模块连接到SFTP服务器。我已经写了下面的代码来解压缩文件,代码正在成功执行,但文件没有被解压缩。有人能帮我哪里出了问题吗?或者用另一种方法在服务器上解压缩文件?

to_sftp.chdir('<dir name>')
flo =  BytesIO()
to_sftp.getfo('<dir name/filename.zip', flo)
flo.seek(0)
root = z.ZipFile(flo,'w')
print(root)
root.extractall(to_sftp.chdir('<dir name'))

ZipFile.extractall无法将文件直接写入SFTP服务器。您必须将文件提取到本地临时文件夹中。然后逐一上传。

AWS Lambda似乎在/tmp中有一个临时文件夹,就像普通的*nix服务器一样。请参阅我可以在AWS Lambda函数上存储临时文件吗?


其他选项是使用ZipFile.infolistZipFile.namelist显式迭代ZIP存档中的所有文件,并使用ZipFile.openSFTPClient.putfo:将它们在内存中传输到SFTP服务器

for i in root.infolist():
with root.open(i) as f:
to_sftp.putfo(f, "/remote/path/" + i.filename)

(未经测试,只是一个概念(


或者,如果您有对服务器的shell访问权限,请直接在服务器上运行unzip(或等效程序(,以避免下载ZIP文件并上传回提取的文件。


请注意,直接从SFTP服务器读取ZIP存档可能更高效:

with to_sftp.open('<dir name/filename.zip', bufsize=32768) as f:
root = z.ZipFile(f, 'r')

我还认为r模式更适合您的任务
对于bufsize=32768,请参阅读取用Python Paramiko SFTPClient打开的文件。打开方法很慢

最新更新