Skip to content

Latest commit

 

History

History
252 lines (122 loc) · 7.65 KB

File metadata and controls

252 lines (122 loc) · 7.65 KB

数据压缩解压

压缩和解压说白了就是时间换空间,运算换存储的一种解决方案,标准库中的zlib和bz2模块都是数据压缩解压工具,他们的主要应用场景是数据传输.

注意压缩只能是bytes类型

在python3.4中新增了对lzma的支持,也就是说支持zx格式了,它除了有压缩字节序列的接口,也提供了直接从文本读取数据进行压缩的接口.同时bz2也新增了从对文件的压缩解压接口.

zlib

import zlib
exa_str=u"""\
网易体育1月5日报道:

国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,\
巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友\
“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,\
排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。
"""

压缩compress(data[, level])

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

bz2和zlib接口差不多,只是使用的不同的算法

import bz2

压缩compress(data[, level])

level是压缩等级(范围1~9),默认是9,1是最快单压缩最少的,9是最慢但压缩最多得

b_str = bz2.compress(exa_str.encode())
len(b_str)/len(exa_str.encode())
0.8309409888357256

解压decompress(data)

bz2.decompress(b_str).decode("utf-8")
'网易体育1月5日报道:\n\n国际足球历史和统计联合会(IFFHS)今日凌晨在其官网上公布了2015年度世界最佳组织者的评选结果,巴塞罗那前锋梅西问鼎,这也是阿根廷人职业生涯首次当选年度最佳组织核心的荣誉。另外,梅西在巴萨的队友“小白”伊涅斯塔排在第二位,意大利球星皮尔洛力压切尔西王牌阿扎尔占据第三名的位置。值得一提的是,排名前十的球员中有3个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。\n'

文件接口bz2.open(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None)

在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个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。

lzma(py3.4)

python3.4中提供了对lzma压缩算法的支持,现在它可以用于解压.xz格式的文件或者压缩/解压字节序列

压缩字节序列(compress)

import lzma
data_out = lzma.compress(exa_str.encode())
len(data_out)/len(exa_str.encode())
0.8803827751196173

解压字节序列(decompress)

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个来自于皇马。此外,还一同公布了最佳教练的评选,巴萨主帅恩里克力压瓜迪奥拉、阿莱格里等名帅当选。