2016-03-02 45 views
-1

StringIO的寫回磁盤我創建使用StringIOzipfile在內存中的zip文件:在python

inMemoryZip = StringIO() 
outfile = zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED) 
//outfile.write(stuff) 
inMemoryZip.seek(0) 
return inMemoryZip 

這些數據上傳到服務器/數據庫。在某些時候,它被檢索到,我需要將它作爲一個zip文件寫入磁盤。我不知道如何做到這一點。我試過如下:

with open('pathToNewZip.zip', 'w') as archive: 
    archive.write(inMemoryZip.getvalue()) 

這將創建壓縮文件存檔,但是當我雙擊它,我看不到它的內容,它基本上創建自身的副本(另一個相同的.zip文件,但擴展.zip.cpgz)旁邊的原始

我也嘗試:

with open('pathToNewZip.zip', 'w') as archive: 
     shutil.copyfileobj(inMemoryZip, archive) 
如上

但其相同的結果。

我想問題的一部分是我不知道如何解析這些數據。 inMemoryZip(它是StringIO的一個實例)可能包含多個文件。

是否每個文件寫入新行?

.getvalue()返回什麼? StringIO實例中所有文件的數據?

我如何確定之前壓縮的文件的名稱,以便可以使用相同的名稱重新創建它們?

有這樣的:How can I pass a Python StringIO() object to a ZipFile(), or is it not supported?但它看起來像那樣,如果只有一個文件正在寫一次。我的StringIO實例可以有1個文件或10個文件。

+1

注意你或許應該使用'和'wb'考慮ZIP文件是一個二進制格式open'。 – Kupiakos

+0

@ Kupiakos指出 –

+0

這是蟒蛇2還是3? – tdelaney

回答

2

您需要打開@Kupiakos建議的最終文件「wb」,否則最終會導致損壞的存檔。您的其他問題是您需要在使用StringIO緩衝區之前關閉zip文件。 close將文件目錄寫入zip文件。沒有這一點,解壓縮程序可能會做出這樣的假設,這只是多部分zip中的一個,並且做了一些奇怪的事情。名義上,只需添加outfile.close()或把它放在一個上下文管理

inMemoryZip = StringIO() 
with zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED) as output: 
    //outfile.write(stuff) 
inMemoryZip.seek(0) 
return inMemoryZip 

後來

​​
+0

你是男人!我沒有關閉zip文件,這是爲什麼它不起作用。非常感謝 –