python – zipfile存档部分的总和不等于其文件大小

python – zipfile存档部分的总和不等于其文件大小,第1张

概述TL; DR – 实际问题是我正在处理一些提供存档文件中条目信息的内容,并指定存档中的大小来自哪里.下面的例子与我真正的问题(它有数十万个条目)完全不同,但突出了我遇到的实际问题.我的问题是我的存档中有一个非常重要的大小,但是没有计算(实际上用于压缩的开销是我的猜测).我的存档部分的总和(我所有条目的总压缩大小与它们之间的预期间隔)小于存档的实际大小.如何以一种能够深入了解隐藏开销的方式检查存档? TL; DR – 实际问题是我正在处理一些提供存档文件中条目信息的内容,并指定存档中的大小来自哪里.下面的例子与我真正的问题(它有数十万个条目)完全不同,但突出了我遇到的实际问题.我的问题是我的存档中有一个非常重要的大小,但是没有计算(实际上用于压缩的开销是我的猜测).我的存档部分的总和(我所有条目的总压缩大小与它们之间的预期间隔)小于存档的实际大小.如何以一种能够深入了解隐藏开销的方式检查存档?

我在哪里:

我有一个包含三个文件的目录:

> doc.pdf
> cat.jpg
> model.stl

使用免费软件程序,我将它们转储到一个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 zipfileIn [2]: z = zipfile.Zipfile('foo.zip','w')In [3]: z.close()In [4]: import osIn [5]: os.stat('foo.zip').st_sizeOut[5]: 22

如果zip文件不为空,则对于每个文件,您有一个中央目录文件header(至少46个字节)和一个本地文件头(至少30个字节).

实际标头具有可变长度,因为给定长度不包括作为标头一部分的文件名的空间.

总结

以上是内存溢出为你收集整理的python – zipfile存档部分的总和不等于其文件大小全部内容,希望文章能够帮你解决python – zipfile存档部分的总和不等于其文件大小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196298.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存