我对Python很陌生。今天我来到zlib模块并运行以下代码 -
import zlib
s = 'hello world!hello world!hello world!hello world!'
t = zlib.compress(s)
print t
print zlib.decompress(t)
并返回以下内容:
xœËHÍÉÉW(Ï/ÊIQÌ ‚
hello world!hello world!hello world!hello world!
显然,zlib.compress()还会返回除了这些以外的一些奇怪的符号,我无法复制粘贴到我的问题。
我的问题是 -
1)压缩字符串实际意味着什么?
2)这些奇怪的符号是否有任何含义(或任何约定)?
3)compress()函数的实际应用是什么?
N.B.-我不懂任何其他编程语言。所以我的编程经验非常少。
答案 0 :(得分:4)
您正在打印压缩数据。压缩数据不是文本,它只是二进制数据,在较小的空间中表示相同的信息。
通过将压缩数据写入终端,它可以尝试将数据解释为文本;如果它期望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? ?
?
个问号表示终端甚至无法将所有内容解码为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à Ç
.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'
任何可以解释为可打印ASCII字符的字节都是这样显示的,其他所有字符都显示为\xhh
十六进制转义符(使用\n
换行符,回车符和制表符,{{1}分别和\r
。
您还可以将所有字节值编码为十六进制:
\t
数据占用的空间较少,非常非常有用。通过网络发送数据将花费更少的时间(更少的数据发送),或者您可以节省磁盘空间。压缩图像时,甚至可以在压缩时丢弃一些信息;例如,JPEG图像使用这种有损压缩方案。根据您设置的质量级别,您将丢失或多或少的原始信息,但您可以将大量图像信息填充到文件中。