首页 > 编程知识 正文

python sys模块,python压缩文件夹为zip

时间:2023-05-04 13:29:42 阅读:17639 作者:4044

从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 (' arch ve _ 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

很遗憾,我很笨拙,但是: (可以工作。 谢谢你!

也可以避免提取可执行文件。 首先检查名称,如果不是可执行文件,则检查输入。 节约浪费的提取时间。

虽然不优雅,但这是我做的:

导入子流程

导入zipfile

z=zipfile.zipfile(zip_filename )

files _ to _ del=filter (lambdaf : f.endswith (' exe ),z.namelist ) ]

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

subprocess.check_call(cmd )

#重新加载the modified archive

z=zipfile.zipfile(zip_filename )

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

可以使用ruamel.std.ZIPfile 1中的例程delete_from_zip_file,根据zip的完整路径或(re )模式删除文件。 例如。 可以使用以下命令从test.zip中删除所有. exe文件

fromruamel.STD.zipfileimportdelete _ from _ zip _ file

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

(请注意前面的几点。

这类似于mdm解决方案,包括需要重新压缩,但ZIP文件将在内存中重新创建,并在使用InMemZipFile类(完全加载后复盖旧文件。

免责声明:我是这个软件包的作者。 子子

delete_from_zip_file例程对我非常有用,但如果尝试从包含一组文件夹的大型归档文件(大小约为3Gb )中删除许多文件,则会出现此错误。 ' LargeZipFile:Zipfile大小需要ZIP64扩展名。 我认为需要在ruamel.std.zipfile的init.py文件中进行修改。 例如,如果是zipfile.zipfile(…,allowZip64=True ),是吗?

我没有和allowZip64一起工作过,所以不知道那个的意思。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。