压缩和解压说白了就是时间换空间,运算换存储的一种解决方案,标准库中的zlib和bz2模块都是数据压缩解压工具,他们的主要应用场景是数据传输.
注意压缩只能是bytes类型
在python3.4中新增了对lzma的支持,也就是说支持zx格式了,它除了有压缩字节序列的接口,也提供了直接从文本读取数据进行压缩的接口.同时bz2也新增了从对文件的压缩解压接口.
import zlib
exa_str=u"""\
网易体育1月5日报道:
国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,\
巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友\
“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,\
排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。
"""
level是压缩等级(范围0~9),默认是6,1是最快单压缩最少的,9是最慢但压缩最多得,0表示不压缩
z_str=zlib.compress(exa_str.encode())
len(z_str)/len(exa_str.encode())
0.7527910685805422
可以看到默认level时压缩率在75%的样子
zlib.decompress(z_str).decode("utf-8")
'网易体育1月5日报道:\n\n国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。\n'
压缩器compressobj([level[, method[, wbits[, memLevel[, strategy]]]]])
- level 压缩等级,范围1~9,默认6
- method 压缩方法,目前只支持默认方法
- wbits 确定窗口缓冲区的大小,范围是8~15,越高效果越好,但占用内存越多
- memLevel 内部压缩状态存储等级,范围1~9,数值越大消耗内存越多,但更快压缩率更高
- strategy 压缩算法相关,可选值有
Z_DEFAULT_STRATEGY
,Z_FILTERED
,Z_HUFFMAN_ONLY
解压器decompressobj(wbits=15)
bz2和zlib接口差不多,只是使用的不同的算法
import bz2
level是压缩等级(范围1~9),默认是9,1是最快单压缩最少的,9是最慢但压缩最多得
b_str = bz2.compress(exa_str.encode())
len(b_str)/len(exa_str.encode())
0.8309409888357256
bz2.decompress(b_str).decode("utf-8")
'网易体育1月5日报道:\n\n国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。\n'
在py3.3中新提供的压缩文件接口,通常用于处理.bz
格式的文件,在3.4中又进行了完善,目前支持的mode为:
- 字节序列可以使用'r', 'rb', 'w', 'wb', 'x', 'xb', 'a'或者'ab'
- 文本可以使用'rt', 'wt', 'xt' 或者 'at'
with bz2.open("test.bz2",'wt') as f:
f.write(exa_str)
with bz2.open("test.bz2",'rt') as f:
print(f.read())
网易体育1月5日报道:
国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。
python3.4中提供了对lzma压缩算法的支持,现在它可以用于解压.xz
格式的文件或者压缩/解压字节序列
import lzma
data_out = lzma.compress(exa_str.encode())
len(data_out)/len(exa_str.encode())
0.8803827751196173
lzma.decompress(data_out).decode("utf-8")
'网易体育1月5日报道:\n\n国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。\n'
lzc = lzma.LZMACompressor()
out1 = lzc.compress(b"Some data\n")
out2 = lzc.compress(b"Another piece of data\n")
out3 = lzc.compress(b"Even more data\n")
out4 = lzc.flush()
result = b"".join([out1, out2, out3, out4])
result
b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3\xe0\x00.\x00+]\x00)\x9b\xc9\xa6gB-8\xa2k\x95V\x1b\xc7\xccb\x8f\xf2\xe7\xe0\x13\x12\xc8\xdc\xaf(\x10\xdf\xb0\xc1\x1a\x95$\xf4\xde\x0f\xc1~l\x1d\xa6 \x00\x00\x00,\xdc\xbd\xb54c,$\x00\x01G/\xb0Qo4\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ'
lzma.decompress(result)
b'Some data\nAnother piece of data\nEven more data\n'
文件接口lzma.open(filename, mode="rb", *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None)
与bz2类似,lzma也提供了一个处理文件的接口,用法也大同小异
with lzma.open("test.xz",'wt') as f:
f.write(exa_str)
with lzma.open("test.xz",'rt') as f:
print(f.read())
网易体育1月5日报道:
国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。