如何使用zlib压缩字符串并获取压缩后的字符串?

24
我正在尝试使用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

请问是否了解其他压缩方法,能够给出与上述代码一致的更好结果?

在您的另一个程序中,有什么阻止您使用zlib.decompress()呢? - Frédéric Hamidi
1
你会采纳我对你之前问题的回答吗?这可能会鼓励我帮助你解决新问题。我现在明白你的意思了。 - David Heffernan
我该如何打印S以便在另一个程序中使用? - Quixotic
1
请注意,对于非常小的字符串进行压缩,压缩数据的开销可能比原始字符串更长... - Matt Billenstein
brotli.decompress(base64.b64decode(base64.b64encode(brotli.compress("payloadpayload..".encode())).decode())).decode() 提供了稍微更好的压缩比,并在 Python 3 中返回一个字符串。不过,我不理解 basse64 编码/解码 - 如果有更合理的解释或方法,将不胜感激。(我正在使用压缩后的字符串作为缓存键,因此需要一个字符串。) - Chris
2个回答

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)

@Tretwick Marian:我不确定你所说的仅限于两个文件是什么意思。也许你是在寻找一种方法,其中有两个进程,一个发送压缩文本,另一个解压它?那么这可能与你之前的问题有关。请解释一下你想要实现的总体目标是什么。 - eat
将文本转换为ASCII码,然后将所得的ASCII码再转回文本。 - Quixotic
@Tretwick:你说的话没有任何意义。所以现在是编码问题?如果是这样,就像之前建议的那样,使用base64编码是你要寻找的。 - Tim Pietzcker
我已经得到了我的答案 :) 如果您知道更好的方法,请建议。 - Quixotic
8
这在以前可能是正确的。使用Python 3.6.5时,会出现以下错误:TypeError: a bytes-like object is required, not 'str' - matanster
显示剩余6条评论

1

根据zlib文档,针对Python 3用户,遵循接受答案的评论:

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() 来返回编码为 bytes 的此字符串的副本,例如:

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

这段代码解释了错误 TypeError: a bytes-like object is required, not 'str' 并提供了修复方法。

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