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

问题描述 投票:0回答:1

我有一个位于 SFTP 服务器上的 zip 文件。我正在编写一个 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'))
python zip sftp paramiko
1个回答
2
投票

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

AWS Lambda 似乎在

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


其他选项是使用

ZipFile.infolist
ZipFile.namelist
显式迭代 ZIP 存档中的所有文件,并使用
ZipFile.open
SFTPClient.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.open方法打开的文件很慢

© www.soinside.com 2019 - 2024. All rights reserved.