我想出的从 zip 文件中删除文件的唯一方法是创建一个没有要删除的文件的临时 zip 文件,然后将其重命名为原始文件名。
在 python 2.4 中,ZipInfo 类有一个属性 file_offset
,因此可以创建第二个 zip 文件并将数据复制到其他文件而无需解压缩/重新压缩。
这个 file_offset
在 python 2.6 中丢失了,那么除了通过解压缩每个文件然后再次重新压缩来创建另一个 zipfile 之外还有其他选择吗?
是否有直接删除 zip 文件中文件的方法,我搜索过但没有找到任何东西。
原文由 RSabet 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下代码段对我有用(从 Zip 存档中删除所有 *.exe 文件):
如果将所有内容都读入内存,则可以消除对第二个文件的需要。然而,这个片段重新压缩了一切。
仔细检查后
ZipInfo.header_offset
是从文件开始的偏移量。该名称具有误导性,但主要 Zip 标头实际上存储在文件末尾。我的十六进制编辑器证实了这一点。因此,您将遇到的问题如下:您还需要删除主标头中的目录条目,否则它将指向一个不再存在的文件。如果您还保留要删除的文件的本地标头,则保持主标头完好无损可能会起作用,但我不确定。你是如何用旧模块做到的?
在不修改主标头的情况下,当我打开它时出现错误“zipfile 中缺少 X 个字节”。 这 可能会帮助您了解如何修改主标头。