如何使用zlib压缩字符串并得到返回字符串?

24 投票
2 回答
36212 浏览
提问于 2025-04-16 10:55

我正在尝试使用Zlib来压缩文本。

比如说,我有一个字符串 T='blah blah blah blah',我需要对这个字符串进行压缩。我使用 S=zlib.compress(T) 来进行压缩。现在我想要的是得到 S 的非二进制形式,这样我就可以在另一个程序中解压缩 T

谢谢!

编辑:我想我找到了一个方法来解决我想要的。这里是这个方法:

import zlib, base64
text = 'STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW '
code =  base64.b64encode(zlib.compress(text,9))
print code

这个方法的结果是:

eNoLDnF09lbwD3MNcvPxD1cIHhxcAE9UKaU=

现在我可以把这段代码复制到另一个程序中,以便恢复原来的变量:

import zlib, base64
s='eNoLDnF09lbwD3MNcvPxD1cIHhxcAE9UKaU='
data = zlib.decompress(base64.b64decode(s))
print data

如果你知道其他压缩方法能得到更好的结果,请告诉我。

2 个回答

1

根据被接受的答案中的评论,对于python 3的用户,按照zlib的文档说明:

def compress(data, /, level=-1)
    Returns a bytes object containing compressed data.

    data
      Binary data to be compressed.
    level
      Compression level, in 0-9 or -1.
(END)

这意味着第一个参数必须是字节类型,而"T"是字符串,不是字节。你只需要使用来自str类型的.encode()方法,就可以把这个字符串转换成字节类型,举个例子:

T = 'blah blah blah blah'
S = zlib.compress(T.encode())

这就解释了错误TypeError: a bytes-like object is required, not 'str'的原因,并且提供了解决办法。

15

程序 1:

T = 'blah blah blah blah'
S = zlib.compress(T)
with open("temp.zlib", "wb") as myfile:
    myfile.write(S)

这个程序会把压缩后的字符串保存到一个叫做 temp.zlib 的文件里,这样程序 2 就可以稍后取出这个文件并解压缩它。

程序 2:

with open("temp.zlib", "rb") as myfile:
    S = myfile.read()
T = zlib.decompress(S)

撰写回答