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

标签 python zip delete-file

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

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

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

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

最佳答案

以下片段对我有用(从 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 header 实际上存储在文件末尾。我的十六进制编辑器证实了这一点。

因此您将遇到的问题如下:您还需要删除主标题中的目录条目,否则它将指向一个不再存在的文件。如果您也保留要删除的文件的本地 header ,则保持主 header 完好无损可能会起作用,但我不确定。您是如何使用旧模块的?

在不修改主标题的情况下,当我打开它时出现错误“zipfile 中缺少 X 个字节”。 This可能会帮助您了解如何修改主标题。

关于python - 使用 ZipFile 模块从 zipfile 中删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513788/

相关文章:

javascript - javascript 上等效的 php 的 gzuncompress

java - JBoss 部署在 Linux 上抛出 'java.util.zip.ZipException: error in opening zip file'?

python - 如何使用spark(python)读取zip文件中CSV文件的内容

batch-file - 报告删除DEL批处理文件中的文件失败

c++ - 为什么这种删除文件夹内文件的方法不起作用?

python - 如何使用 Google Drive API 一次删除多个文件

python - 安装pywin32时出现问题

python - 如何通过 requests-oauthlib token 获取避免 InValidClientError?

python - 使 QPushButton 关闭所有打开的程序窗口

python - 无法在 Intellij IDEA 中从 requirements.txt 安装某些库