[英]Python: Open zip file from binary instead of filename
有沒有辦法通過傳入zip文件的文字字節來初始化ZipFile
對象,而不是讓它讀取文件名? 我正在構建一個不需要觸摸磁盤的寧靜應用程序; 它只是打開文件,對它做一些工作,重新拉鏈並發送它。
在對其他答案的評論中,你說你想這樣做:
打開二進制字符串,就像它是一個zip文件一樣。 打開它,讀/寫其中的文件,然后關閉它
除了創建一個預先填充二進制字符串的StringIO.StringIO
(或cStringIO.StringIO
或io.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.