簡體   English   中英

用Python將StringIO寫回到磁盤

[英]writing StringIO back to disk in python

我使用StringIOzipfile創建了一個內存中的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.

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