1
的Python中的每個文件使內存拉鍊的副本,只要知道了,不允許歸檔文件的修改。這就是爲什麼我想:通過iterrating在輸入
- 拆開內存(zip_in)拉鍊。
- 投奔在zip_in每個文件,並改變它,如果需要,然後將其複製到zip_out。現在我很高興製作一個文件的副本。
- 保存zip_out。
我正在試驗zipfile
和io
但沒有運氣。部分原因是我不確定所有這些工作以及哪個對象需要哪個輸出。
工作代碼
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
謝謝,馬特。結合`編解碼器'和你的提示,我解決了這個問題。 – marw 2011-02-08 19:16:52