以下片段对我有用(从 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()
如果您将所有内容都读入内存,则可以消除对第二个文件的需要。但是,这个片段重新压缩了所有内容。
经过仔细检查,这ZipInfo.header_offset
是从文件开始的偏移量。名称具有误导性,但主 Zip 标头实际上存储在文件末尾。我的十六进制编辑器证实了这一点。
因此,您将遇到的问题如下:您还需要删除主标题中的目录条目,否则它将指向一个不再存在的文件。如果您也保留要删除的文件的本地标头,则保持主标头完整可能会起作用,但我不确定。你是怎么用旧模块做的?
在不修改主标题的情况下,打开它时出现错误“zipfile 中缺少 X 字节”。这可能会帮助您了解如何修改主标题。