zlib compress 后 decompress 得不到原来的内容( Python 3.8)

2020-11-05 01:00:13 +08:00
 wingkou

代码如下:

import zlib
str1 = "1234567890"
data1 = str1.encode()
print(len(data1), data1.decode())
data2 = zlib.compressobj().compress(data1)
data3 = zlib.decompressobj().decompress(data2)
str2 = data3.decode()
print(len(str2), str2)

我这里输出的是:

10 1234567890
0

为什么会这样的呢?

1946 次点击
所在节点    Python
4 条回复
lcdtyph
2020-11-05 01:10:11 +08:00
(de)compressobj()返回的对象是有状态的,主要用来处理流数据,在输入结束之后要调用 obj.flush() 来接收最后一段输出

如果是一次性压缩解压可以直接调用 zlib.compress 。如果一定要用(de)compressobj 可以这样:
cobj = zlib.compressobj()
dobj = zlib.decmpressobj()

data2 = cobj.compress(data1)
data2 += cobj.flush()

data3 = dobj.decompress(data2)
data3 += dobj.flush()
wingkou
2020-11-05 01:22:08 +08:00
@lcdtyph 感谢,因为有个文件直接`zlib.compress`会报错,但是`zlib.decmpressobj().decompress()`却不会,才搞的这种写法。这问题也 Google 不到,大半夜还搞得焦头烂额的。不知道你知道有什么区别吗?
wingkou
2020-11-05 01:24:05 +08:00
@lcdtyph 上面打快了,应该是`zlib.decompress()`会报错,但是`zlib.decmpressobj().decompress()`却不会。
owtotwo
2020-11-05 17:52:52 +08:00
建议把报错的 minimum 文件样例也列出来,不然不好复现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/721869

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX