zlib.compress(string) 在 Python 2.7.8 中返回什么

ni8*_*8mr 1 python python-2.7

我对 Python 很陌生。今天我来到了关于 zlib 模块并运行了以下代码 -

import zlib
s = 'hello world!hello world!hello world!hello world!'
t = zlib.compress(s)
print t
print zlib.decompress(t)
Run Code Online (Sandbox Code Playgroud)

它返回以下内容:

xœËHÍÉÉW(Ï/ÊIQÌ ‚
hello world!hello world!hello world!hello world!
Run Code Online (Sandbox Code Playgroud)

显然, zlib.compress() 还会返回一些奇怪的符号,而不是这些符号,我无法将其复制粘贴到我的问题中。

我的问题是——

1) 压缩字符串实际上意味着什么?

2)这些奇怪的符号有什么含义(或任何类型的约定)吗?

3) compress() 函数在现实生活中有哪些应用?

注意-我不知道任何其他编程语言。所以我的编程经验很少。

Mar*_*ers 5

您正在打印压缩数据。压缩数据不是文本,它只是二进制数据,用更少的空间表示相同的信息。

通过将压缩数据写入您的终端,它可能会尝试将数据解释为文本;如果它需要 Latin-1 或 UTF-8 编码的文本,那么它会尝试解码该数据并显示它设法解码的文本。所以你最终会得到胡言乱语,因为数据实际上不是文本。

我的 Mac 终端设置为 UTF-8,我得到的信息与您看到的有所不同:

>>> import zlib
>>> s = 'hello world!hello world!hello world!hello world!'
>>> t = zlib.compress(s)
>>> print t
?[?H???W(?/?IQ? ?
Run Code Online (Sandbox Code Playgroud)

?问号指示终端甚至没有能够解码一切为UTF-8; 非常预期,因为数据不是有效的 UTF-8。

不同的编码会导致不同的输出;同样,因为数据实际上并不代表任何文本编解码器中的文本:

>>> print t.decode('cp850').encode('utf8')
¢[§H???W(¤/?IQ? é
>>> print t.decode('cp1251').encode('utf8')
?[?H???W(?/?IQ? ‚
>>> print t.decode('mac-roman').encode('utf8')
?[?HÕ……W(œ/ IQà Ç
Run Code Online (Sandbox Code Playgroud)

这些.encode('utf8')电话真的是多余的;Python 检测到我使用的是 UTF-8 终端,并且会自动为我编码 Unicode 字符串。

Python 还可以为您提供相同数据的不同表示;在您的 Python 解释器中回显字符串(而不是使用print),或打印 的输出repr()给您格式化为 Python 字符串文字的输出,这将重新创建相同的值:

>>> t
'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaIQ\xcc \x82\r\x00\xbd[\x11\xf5'
>>> print repr(t)
'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaIQ\xcc \x82\r\x00\xbd[\x11\xf5'
Run Code Online (Sandbox Code Playgroud)

任何可以解释为可打印 ASCII 字符的字节都显示为这样,其他所有内容都显示为\xhh十六进制转义(换行符、回车符和制表符分别使用\n\r\t)。

您还可以将所有字节值编码为十六进制:

>>> print t.encode('hex')
789ccb48cdc9c95728cf2fca4951cc20820d00bd5b11f5
Run Code Online (Sandbox Code Playgroud)

让数据占用更少的空间非常有用。通过网络发送数据将花费更少的时间(发送更少的数据),或者您可以节省磁盘空间。在压缩图像时,您甚至可以在压缩时丢弃一些信息;例如,JPEG 图像使用这种有损压缩方案。根据您设置的质量级别,您会丢失或多或少的原始信息,但您可以通过这种方式将大量图像信息塞入一个文件中。