2011-02-03 89 views
1

的Python中的每個文件使內存拉鍊的副本,只要知道了,不允許歸檔文件的修改。這就是爲什麼我想:通過iterrating在輸入

  1. 拆開內存(zip_in)拉鍊。
  2. 投奔在zip_in每個文件,並改變它,如果需要,然後將其複製到zip_out。現在我很高興製作一個文件的副本。
  3. 保存zip_out。

我正在試驗zipfileio但沒有運氣。部分原因是我不確定所有這些工作以及哪個對象需要哪個輸出。

工作代碼

import os 
import io 
import codecs 
import zipfile 

# Make in-memory copy of a zip file 
# by iterating over each file in zip_in 
# archive. 
# 
# Check if a file is text, and in that case 
# open it with codecs. 

zip_in = zipfile.ZipFile(f, mode='a') 
zip_out = zipfile.ZipFile(fn, mode='w') 
for i in zip_in.filelist: 
    if os.path.splitext(i.filename)[1] in ('.xml', '.txt'): 
     c = zip_in.open(i.filename) 
     c = codecs.EncodedFile(c, 'utf-8', 'utf-8').read() 
     c = c.decode('utf-8') 
    else: 
     c = zip_in.read(i.filename) 
    zip_out.writestr(i.filename, c) 
zip_out.close() 

舊示例,一個問題

# Make in-memory copy of a zip file 
# by iterating over each file in zip_in 
# archive. 
# 
# This code below does not work properly. 

zip_in = zipfile.ZipFile(f, mode='a') 
zip_out = zipfile.ZipFile(fn, mode='w') 
for i in zip_in.filelist: 
    bc = io.StringIO() # what about binary files? 
    zip_in.extract(i.filename, bc) 
    zip_out.writestr(i.filename, bc.read()) 
zip_out.close() 

該錯誤是TypeError: '_io.StringIO' object is not subscriptable

回答

2

ZipFile.extract()期望的文件名,而不是一個類文件對象寫入。而是使用ZipFile.read(name)來獲取文件的內容。它返回字節字符串,因此可以很好地處理二進制文件。文本文件可能需要解碼爲unicode。

+0

謝謝,馬特。結合`編解碼器'和你的提示,我解決了這個問題。 – marw 2011-02-08 19:16:52