python – zipfile存档部分的总和不等于其文件大小
TL; DR – 实际问题是我正在处理一些提供存档文件中条目信息的内容,并指定存档中的大小来自哪里.下面的例子与我真正的问题(它有数十万个条目)完全不同,但突出了我遇到的实际问题.我的问题是我的存档中有一个非常重要的大小,但是没有计算(实际上用于压缩的开销是我的猜测).我的存档部分的总和(我所有条目的总压缩大小与它们之间的预期间隔)小于存档的实际大小.如何以一种能够深入了解隐藏开销的方式检查存档?
我在哪里: 我有一个包含三个文件的目录: > doc.pdf 使用免费软件程序,我将它们转储到一个zip文件:demo.zip 使用python我可以很容易地检查这些: info_list= zipfile.ZipFile('demo.zip').infolist() for i in info_list: print i.orig_filename print i.compress_size print i.header_offset 使用此信息我们可以获得一些信息. demo.zip的总大小是84469 压缩大小: |---------------------|-----------------|---------------| | File | Compressed Size | Header Offset | |---------------------|-----------------|---------------| | doc.pdf | 21439 | 0 | |---------------------|-----------------|---------------| | cat.jpg | 48694 | 21495 | |---------------------|-----------------|---------------| | model.stl | 13870 | 70232 | |---------------------|-----------------|---------------| 我知道压缩会在条目之间产生一些空间. (因此,先前条目大小的总和与每个条目的标题偏移之间的差异).你可以计算出这个小的’差距’: gap = offset - previous_entry_size - previous_entry_offset 我可以将我的图表更新为: |---------------------|-----------------|---------------|---------------| | File | Compressed Size | Header Offset | 'Gap' | |---------------------|-----------------|---------------|---------------| | doc.pdf | 21439 | 0 | 0 | |---------------------|-----------------|---------------|---------------| | cat.jpg | 48694 | 21495 | 56 | |---------------------|-----------------|---------------|---------------| | model.stl | 13870 | 70232 | 43 | |---------------------|-----------------|---------------|---------------| 凉.所以现在可以预期demo.zip的大小将等于所有条目的大小和它们的差距的总和. (上例中为84102). 但事实并非如此.所以,显然,压缩需要标题和有关如何发生压缩(以及如何解压缩)的信息.但是我遇到了如何定义或访问有关它的更多信息的问题. 我可以采取84469 – 84102并说?魔术拉链开销?= 367字节.但这似乎不太理想,因为这个数字显然不是魔术.有没有办法检查占用这个空间的底层zip数据? 解决方法
空的zip文件是
22 bytes,仅包含中央目录记录的结尾.
In [1]: import zipfile In [2]: z = zipfile.ZipFile('foo.zip','w') In [3]: z.close() In [4]: import os In [5]: os.stat('foo.zip').st_size Out[5]: 22 如果zip文件不为空,则对于每个文件,您有一个中央目录文件header(至少46个字节)和一个本地文件头(至少30个字节). 实际标头具有可变长度,因为给定长度不包括作为标头一部分的文件名的空间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |