Python中的zlib:如何解压多个对象

3
我尝试在我的文件上写入许多zlib块,是否有一种方法可以从我的文件中获取所有未压缩的内容?从下面的示例代码中,我只能获取我的第一个数据。非常感谢您提供任何帮助!
Python 3.6.8 |Anaconda, Inc.| (default, Dec 29 2018, 19:04:46) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import zlib
>>> str1 = b'my first string'
>>> str2 = b'my second string'
>>> z1 = zlib.compress(str1)
>>> z2 = zlib.compress(str2)
>>> with open('test.z', 'wb') as fh:
...     fh.write(z1)
...     fh.write(z2)
... 
23
24
>>> p = open('test.z','rb').read()
>>> p
b'x\x9c\xcb\xadTH\xcb,*.Q(.)\xca\xccK\x07\x00.6\x05\xe6x\x9c\xcb\xadT(NM\xce\xcfKQ(.)\xca\xccK\x07\x003\xfb\x06:'
>>> zlib.decompress(p)
b'my first string'
>>> zlib.decompress(p)
b'my first string'

1
猜测 zlib 可以从它的头部信息中得知需要读取和解压缩的字节数。由于该文件包含两个分别被压缩的字节串,第一个头部信息告诉它要读取23个字节,因此剩余的字节就不会被读取。如果你尝试解压缩 p[23:],或者在压缩之前将这些行连接起来 z = zlib.compress(str1+str2),看看会发生什么。 - snakecharmerb
谢谢@snakecharmerb。zlib.decompress(p[23:])确实有效,并给了我str2的内容,我做出了一个假设,即我事先不知道大小/偏移量... - dli
1个回答

5

无法通过单个函数或方法调用来解压缩串联的压缩流*。但是,可以使用zlib包中的工具获得等效功能。

>>> import zlib
>>> b1 = b'Here is some data'
>>> b2 = b'Here is some more data'
>>> stream = zlib.compress(b1) + zlib.compress(b2)


>>> while stream:
...     dco = zlib.decompressobj()
...     dec = dco.decompress(stream)
...     print(dec)
...     stream = dco.unused_data
... 
b'Here is some data'
b'Here is some more data'

zlib.decompressobj()创建一个对象,用于解压缩单个压缩流(例如zlib.decompress),并在其unused_data属性中公开流中剩余的字节。因此,我们可以循环解压缩,直到整个连接的流被解压缩。

*至少我没有找到


这非常有用。谢谢! - dli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接