У меня сработал следующий фрагмент (удаляет все файлы * .exe из архива Zip):
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()
Если вы прочитаете все в память, вы можете исключить необходимость во втором файле. Однако этот фрагмент повторно сжимает все.
После более тщательной проверки ZipInfo.header_offset
- это смещение от начала файла. Название вводит в заблуждение, но основной Zip-заголовок фактически хранится в конце файла. Мой hex-редактор подтверждает это.
Итак, проблема, с которой вы столкнетесь, заключается в следующем: вам также необходимо удалить запись каталога в главном заголовке, иначе она укажет на файл, который больше не существует. Оставление основного заголовка без изменений может работать, если вы также сохраните локальный заголовок удаляемого файла, но я не уверен в этом. Как ты это сделал со старым модулем?
Не изменяя основной заголовок, я получаю сообщение об ошибке «отсутствует X байт в zipfile» при его открытии. Этот может помочь вам узнать, как изменить основной заголовок.