簡體   English   中英

在 Python 中將類文件對象添加到 Zip 文件

[英]Adding a file-like object to a Zip file in Python

Python ZipFile API 似乎允許將文件路徑傳遞給ZipFile.write或將字節字符串傳遞給ZipFile.writestr但兩者之間沒有任何內容。 我希望能夠傳遞一個類似對象的文件,在這種情況下是django.core.files.storage.DefaultStorage但原則上任何類似文件的對象。 目前我想我要么將文件保存到磁盤,要么將其讀入內存。 這兩者都不是完美的。

你是對的,這是唯一的兩個選擇。 如果您的DefaultStorage對象很大,您可能希望先將其保存到磁盤; 否則,我會使用:

zipped = ZipFile(...)
zipped.writestr('archive_name', default_storage_object.read())

如果default_storage_objectStringIO對象,則可以使用default_storage_object.getvalue()

雖然沒有采用類文件對象的選項,但可以選擇打開 zip 條目進行寫入 (ZipFile.open)。 [文檔]

import zipfile
import shutil
with zipfile.ZipFile('test.zip','w') as archive:
    with archive.open('test_entry.txt','w') as outfile:
        with open('test_file.txt','rb') as infile:
            shutil.copyfileobj(infile, outfile)

您可以使用輸入流作為源,而不必先將文件復制到磁盤。 缺點是如果您的流出現問題,則 zip 文件將無法使用。 在我的應用程序中,我們繞過有錯誤的文件,因此無論如何我們最終都會獲得文件的本地副本,以確保完整性並保留可用的 zip 文件。

暫無
暫無

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

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