次のスニペットは私にとってはうまくいきました(Zipアーカイブからすべての* .exeファイルを削除します):
zin = zipfile.ZipFile ('archive.zip', 'r')
zout = zipfile.ZipFile ('archve_new.zip', 'w')
for item in zin.infolist():
buffer = zin.read(item.filename)
if (item.filename[-4:] != '.exe'):
zout.writestr(item, buffer)
zout.close()
zin.close()
すべてをメモリに読み込むと、2 つ目のファイルが不要になります。ただし、このスニペットはすべてを再圧縮します。
詳しく調べたところ、ZipInfo.header_offset
はファイルの先頭からのオフセットです。名前は誤解を招きますが、メインの Zip ヘッダーは実際にはファイルの最後に格納されています。私の16進エディタはこれを確認します。
したがって、あなたが遭遇する問題は次のとおりです: メイン ヘッダーのディレクトリ エントリも削除する必要があります。そうしないと、存在しないファイルを指してしまいます。削除するファイルのローカル ヘッダーもそのままにしておくと、メイン ヘッダーをそのままにしておくとうまくいくかもしれませんが、それについてはわかりません。古いモジュールでどのようにしましたか?
メインヘッダーを変更せずに開くと、「zipfile に X バイトがありません」というエラーが表示されます。これは、メイン ヘッダーを変更する方法を見つけるのに役立つ場合があります。