32

私はarchive.zip2つのファイルを持っています:hello.txtそしてworld.txt

hello.txtそのコードでファイルを新しいファイルで上書きしたい:

import zipfile

z = zipfile.ZipFile('archive.zip','a')
z.write('hello.txt')
z.close()  

ただし、ファイルは上書きされません。どういうわけか、別のインスタンスが作成されますhello.txt— winzip のスクリーンショットを見てください。

代替テキスト

のようなものはないのでzipfile.remove()、この問題を処理する最善の方法は何ですか?

4

3 に答える 3

43

python zipfile モジュールでそれを行う方法はありません。新しい zip ファイルを作成し、最初のファイルと新しく変更されたファイルからすべてを再圧縮する必要があります。

以下は、まさにそれを行うためのコードです。ただし、すべてのデータを解凍してから再圧縮するため、効率的ではないことに注意してください。

import tempfile
import zipfile
import shutil
import os

def remove_from_zip(zipfname, *filenames):
    tempdir = tempfile.mkdtemp()
    try:
        tempname = os.path.join(tempdir, 'new.zip')
        with zipfile.ZipFile(zipfname, 'r') as zipread:
            with zipfile.ZipFile(tempname, 'w') as zipwrite:
                for item in zipread.infolist():
                    if item.filename not in filenames:
                        data = zipread.read(item.filename)
                        zipwrite.writestr(item, data)
        shutil.move(tempname, zipfname)
    finally:
        shutil.rmtree(tempdir)

使用法:

remove_from_zip('archive.zip', 'hello.txt')
with zipfile.ZipFile('archive.zip', 'a') as z:
    z.write('hello.txt')
于 2011-01-11T03:16:39.477 に答える