python zipfile模块,关于python:使用ZipFile模块从zipfile中删除文件

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

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

python 2.6中缺少此file_offset,是否还有其他选择,而不是通过解压缩每个文件然后再次重新压缩来创建另一个zipfile?

我搜索并没有找到任何内容,也许有直接删除zip文件中文件的直接方法。

我在Python Bug Tracker上发现了该线程,讨论了从zip文件中删除文件的困难:bugs.python.org/issue6818

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

谢谢,但是如果我没记错的话-当您查看zipfile.writestr时,您会看到这只是重新压缩。仅复制已经压缩的文件而不取消压缩,然后再次压缩它们会更快。

@RSabt我同意mdm的观点,即到目前为止,唯一可行的选择是解压缩和重新压缩。顺便说一句,我想指出mdm的代码会有所帮助,但是当您要更认真地进行操作时,最好使用os.path.splitext()。

变量名称+1为zin zout = D

不幸的是笨拙,但它可以工作:)谢谢!

您也可以避免提取可执行文件。首先检查名称,如果不是可执行文件,则检查输入。将节省一些无用的提取时间。

不是很优雅,但这是我做到的:

import subprocess

import zipfile

z = zipfile.ZipFile(zip_filename)

files_to_del = filter( lambda f: f.endswith('exe'), z.namelist()]

cmd=['zip', '-d', zip_filename] + files_to_del

subprocess.check_call(cmd)

# reload the modified archive

z = zipfile.ZipFile(zip_filename)

这就是我最终要做的。难看,但是ZipFile似乎没有删除或更新/替换文件的方法。

ruamel.std.zipfile 1中的例程delete_from_zip_file允许您基于ZIP中的完整路径或基于(re)模式删除文件。例如。您可以使用以下命令从test.zip中删除所有.exe文件

from ruamel.std.zipfile import delete_from_zip_file

delete_from_zip_file('test.zip', pattern='.*.exe')

(请注意*之前的点)。

这与mdm的解决方案(包括需要重新压缩)相似,但是会在内存中重新创建ZIP文件(使用类InMemZipFile()),并在完全读取后覆盖旧文件。

1 免责声明:我是该软件包的作者。 sub>

delete_from_zip_file例程对我来说非常有用,但是在尝试从具有一组文件夹的大型归档文件(大小约为3Gb)中删除许多文件时收到此错误:" LargeZipFile:Zipfile大小将需要ZIP64扩展名"。我猜应该在ruamel.std.zipfile中的init.py文件中进行修改(例如,对于zipfile.ZipFile(..),allowZip64 = True),对吗?

我从没与allowZip64一起工作过,不知道它的含义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值