我在哪里:
我有一个包含三个文件的目录:
> 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存档部分的总和不等于其文件大小所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)