[英]writing StringIO back to disk in python
我使用StringIO
和zipfile
創建了一個內存中的zip文件:
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文件, 但擴展名為.zip.cpgz )。
我也嘗試過:
with open('pathToNewZip.zip', 'w') as archive:
shutil.copyfileobj(inMemoryZip, archive)
但其結果與上述相同。
我想部分問題是我不知道如何解析這些數據。 該inMemoryZip
(這是一個實例StringIO
)可能在它的多個文件。
每個文件都寫成新行嗎?
.getvalue()
返回什么? StringIO
實例中所有文件的數據?
如何確定以前壓縮過的文件的名稱,以便可以使用相同的名稱重新創建它們?
就是這樣: 如何將Python StringIO()對象傳遞給ZipFile(),還是不受支持? 但如果一次只寫入1個文件,則該方法似乎可行。 我的StringIO
實例可以有1個文件或10個文件。
您需要按照@Kupiakos的建議打開最終文件“ wb”,否則最終將導致存檔損壞。 另一個問題是在使用StringIO
緩沖區之前,您需要關閉zipfile。 關閉將文件目錄寫入zipfile。 否則,解壓縮程序可能會做出這樣的假設,例如這僅僅是多部分拉鏈中的一種,並且會做一些奇怪的事情。 名義上,只需添加outfile.close()
或將其放在上下文管理器中
inMemoryZip = StringIO()
with zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED) as output:
//outfile.write(stuff)
inMemoryZip.seek(0)
return inMemoryZip
然后再
with open('pathToNewZip.zip', 'wb') as archive:
archive.write(inMemoryZip.getvalue())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.