RSa*_*bet 35 python zip delete-file
我从zipfile中删除文件的唯一方法是创建一个临时zipfile而不删除该文件,然后将其重命名为原始文件名.
在python 2.4中,ZipInfo类有一个属性file_offset,因此可以创建第二个zip文件并将数据复制到其他文件而不进行解压缩/重新压缩.
这file_offset在python 2.6中是缺失的,所以除了通过解压缩每个文件然后再次重新压缩它来创建另一个zipfile之外还有另一种选择吗?
是否有可能直接删除zipfile中的文件,我搜索并没有找到任何东西.
mdm*_*mdm 43
以下代码片段适用于我(删除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()
Run Code Online (Sandbox Code Playgroud)
如果您将所有内容都读入内存,则可以省去第二个文件.但是,这个片段会重新压缩所有内容.
仔细检查后,ZipInfo.header_offset是文件开始的偏移量.该名称具有误导性,但主Zip头实际上存储在文件的末尾.我的十六进制编辑确认了这一点
因此,您将遇到的问题如下:您还需要删除主标题中的目录条目,否则它将指向不再存在的文件.如果你保留你正在删除的文件的本地标题,保留主标题可能会有效,但我不确定.你是怎么用旧模块做的?
在不修改主标题的情况下,当我打开它时,我得到一个错误"在zipfile中缺少X字节".这可能有助于您了解如何修改主标头.
不是很优雅,但我是这样做的:
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)
Run Code Online (Sandbox Code Playgroud)
小智 9
基于Elias Zamaria对这个问题的评论。
阅读完Python-Issue #51067后,我想提供有关它的更新。
目前,解决方案已经存在,但由于缺少作者的贡献者协议而未得到 Python 的批准。
不过,您可以从https://github.com/python/cpython/blob/659eb048cc9cac73c46349eb29845bc5cd630f09/Lib/zipfile.py获取代码并从中创建一个单独的文件。之后,只需从您的项目中引用它,而不是内置的 python 库:import myproject.zipfile as zipfile。
用法:
with zipfile.ZipFile(f"archive.zip", "a") as z:
z.remove(f"firstfile.txt")
Run Code Online (Sandbox Code Playgroud)
我相信它将包含在未来的Python版本中。对我来说,它对于给定的用例来说就像一个魅力。
delete_from_zip_file\xc2\xb9中的例程ruamel.std.zipfile允许您根据 ZIP 中的完整路径或 ( re) 模式删除文件。例如,您可以使用删除所有.exe文件test.zip
from ruamel.std.zipfile import delete_from_zip_file\n\ndelete_from_zip_file(\'test.zip\', pattern=\'.*.exe\') \nRun Code Online (Sandbox Code Playgroud)\n\n(请注意 之前的点*)。
这与 mdm\ 的解决方案类似(包括需要重新压缩),但在内存中重新创建 ZIP 文件(使用 类InMemZipFile()),在完全读取后覆盖旧文件。
\xc2\xb9免责声明:我是该包的作者。
\n| 归档时间: |
|
| 查看次数: |
19414 次 |
| 最近记录: |