使用 ZipFile 模块从 zipfile 中删除文件

新手上路,请多包涵

我想出的从 zip 文件中删除文件的唯一方法是创建一个没有要删除的文件的临时 zip 文件,然后将其重命名为原始文件名。

在 python 2.4 中,ZipInfo 类有一个属性 file_offset ,因此可以创建第二个 zip 文件并将数据复制到其他文件而无需解压缩/重新压缩。

这个 file_offset 在 python 2.6 中丢失了,那么除了通过解压缩每个文件然后再次重新压缩来创建另一个 zipfile 之外还有其他选择吗?

是否有直接删除 zip 文件中文件的方法,我搜索过但没有找到任何东西。

原文由 RSabet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

以下代码段对我有用(从 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 个字节”。 可能会帮助您了解如何修改主标头。

原文由 mdm 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题