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')