簡體   English   中英

使用 Python 在 SFTP 服務器上解壓文件

[英]Unzip files on an SFTP server using Python

我在 SFTP 服務器上有一個 zip 文件。 我正在寫一個 AWS lambda function 並有 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 Function 上存儲臨時文件嗎?


另一種選擇是使用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的目的,請參閱Reading file opened with Python Paramiko SFTPClient.open method is slow

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM