如何使用 python zipfile 库检查 zip 文件是不是在多个档案中拆分?
Posted
技术标签:
【中文标题】如何使用 python zipfile 库检查 zip 文件是不是在多个档案中拆分?【英文标题】:How to check if zip file is split across multiple archives using python's zipfile lib?如何使用 python zipfile 库检查 zip 文件是否在多个档案中拆分? 【发布时间】:2012-08-20 14:09:04 【问题描述】:根据 zip 文件标准:http://www.pkware.com/documents/casestudies/APPNOTE.TXT 它还支持将一个 zip 文件拆分为多个文件:
Spanned/Split archives created using PKZIP for Windows
(V2.50 or greater), PKZIP Command Line (V2.50 or greater),
or PKZIP Explorer will include a special spanning
signature as the first 4 bytes of the first segment of
the archive. This signature (0x08074b50) will be
followed immediately by the local header signature for
the first file in the archive.
A special spanning marker may also appear in spanned/split
archives if the spanning or splitting process starts but
only requires one segment. In this case the 0x08074b50
signature will be replaced with the temporary spanning
marker signature of 0x30304b50. Split archives can
only be uncompressed by other versions of PKZIP that
know how to create a split archive.
The signature value 0x08074b50 is also used by some
ZIP implementations as a marker for the Data Descriptor
record. Conflict in this alternate assignment can be
avoided by ensuring the position of the signature
within the ZIP file to determine the use for which it
is intended.
知道如何检查该签名或以其他方式检查一个 zip 是否拆分为多个文件吗?
【问题讨论】:
【参考方案1】:他们在标准中讨论的特定签名,即 PK\007\008
根本不由 zipfile 处理,这可以通过对库源的 grepping 看出(我在 Python 3.2 中得到了相同的结果):
# grep PK /usr/lib/python2.7/zipfile.py
stringEndArchive = "PK\005\006"
stringCentralDir = "PK\001\002"
stringFileHeader = "PK\003\004"
stringEndArchive64Locator = "PK\x06\x07"
stringEndArchive64 = "PK\x06\x06"
所以我怀疑您是否可以为此目的使用该库。不妨尝试通过扩展库自己找到该签名。
【讨论】:
关于我应该如何处理这个问题的任何建议? 您可以尝试在一些拆分的 zip 文件上实例化 ZipFile,看看它是如何中断的。接下来,修复并添加代码到 ZipFile 类(在 'open' 方法中的某个位置),如果给定一个拆分存档,则会抛出一个很好的异常。然后,将补丁发送给 Python 的维护者 :) 我想我现在会在 testzip() 上捕获 RuntimeError!以上是关于如何使用 python zipfile 库检查 zip 文件是不是在多个档案中拆分?的主要内容,如果未能解决你的问题,请参考以下文章
如何将动态生成的pdf文件添加到zipfile Python?