当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用ZipFile模块从zipfile中删除文件》经验,为你挑选了1个好方法。

我从zipfile中删除文件的唯一方法是创建一个临时zipfile而不删除该文件,然后将其重命名为原始文件名.

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

file_offset在python 2.6中是缺失的,所以除了通过解压缩每个文件然后再次重新压缩它来创建另一个zipfile之外还有另一种选择吗?

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



1> mdm..:

以下代码片段适用于我(删除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字节".这可能有助于您了解如何修改主标头.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有