簡體   English   中英

Python:從二進制而不是文件名打開zip文件

[英]Python: Open zip file from binary instead of filename

有沒有辦法通過傳入zip文件的文字字節來初始化ZipFile對象,而不是讓它讀取文件名? 我正在構建一個不需要觸摸磁盤的寧靜應用程序; 它只是打開文件,對它做一些工作,重新拉鏈並發送它。

在對其他答案的評論中,你說你想這樣做:

打開二進制字符串,就像它是一個zip文件一樣。 打開它,讀/寫其中的文件,然后關閉它

除了創建一個預先填充二進制字符串的StringIO.StringIO (或cStringIO.StringIOio.BytesIO )之外,您只需執行與其他答案相同的StringIO.StringIO ,並在最后提取字符串。 StringIO和朋友為他們的構造函數獲取一個可選的初始字符串,並且在完成后有一個getvalue方法來提取字符串。 文檔非常簡單,值得一讀。

所以,盡可能貼近alecxe的答案:

from zipfile import ZipFile
try:
    import cStringIO as StringIO
except ImportError:
    import StringIO

in_memory = StringIO.StringIO(original_zip_data)
zf = ZipFile(in_memory, "a")  

zf.writestr("file.txt", "some text contents")

zf.close()

new_zip_data = in_memory.getvalue()

但請注意, ZipFile無法真正寫入zip存檔,除了向其添加新文件的特殊情況。 對於內存中的zip存檔和磁盤上的情況也是如此。 您通常可以通過附加具有相同路徑的新文件來覆蓋存檔中的文件,但這通常是個壞主意(特別是如果您要創建這些內容以通過互聯網發送)。

因此,您可能想要做的與您想要修改文件時完全相同:創建一個單獨的輸出文件,從輸入文件中復制您需要的東西,並在進行時編寫新內容。 只是在這種情況下,輸入和輸出文件都是包裝StringIO對象的ZipFile對象。

當然,請改為使用(c)StringIO: http ://docs.python.org/2/library/stringio.html此外,您應該使用BytesIO for Python 3.但它確實存在2.6和2.7。

以下是使用(c)StringIO

from zipfile import ZipFile
try:
    import cStringIO as StringIO
except ImportError:
    import StringIO

in_memory = StringIO.StringIO()   
zf = ZipFile(in_memory, "a")  

zf.writestr("file.txt", "some text contents")

zf.close()

另見:

暫無
暫無

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

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