Python 常用压缩库(zlib, bz2, gzip)以及压缩格式特点

压缩库

Python 常用的三个用于数据压缩/解压缩的库是: zlib, bz2, gzip.

gzip:gzip压缩算法
zlib:对gzip所用算法的一个改进,去除部分冗余的信息,来提高对缓冲区数据的压缩速度。但核心算法和gzip是相同的。
bz2wiki:Bzip2 uses several layers of compression techniques stacked on top of each other, which occur in the following order during compression and the reverse order during decompression. bz2所用算法是多层技术的自上而下的叠加,压缩与解压缩时各层技术顺序相反,或许这也是导致bz2压缩效率高但是压缩速度较慢的原因。


使用方法

import zlib, bz2, gzip
# Compress 压缩
# file_to_compress: Bytes
# out: Bytes
out = zlib.compress(file_to_compress)
out = bz2.compress(file_to_compress)
out = gzip.compress(file_to_compress)
# Decompress 解压缩
# file_to_decompress: Bytes
# out: Bytes
out = zlib.compress(file_to_decompress)
out = bz2.compress(file_to_decompress)
out = gzip.compress(file_to_decompress)

压缩格式特点

输入在经过压缩后,输出被压缩的字节串。

如何通过字节串判断压缩格式?

首先进行如下实验进行观察:

import zlib, bz2, gzip

s1 = "Python Compression"
s2 = "Same Starters?"

print(s1)
print(s2)
print("s1: zlib\t", zlib.compress(s1.encode('utf-8')))
print("s2: zlib\t", zlib.compress(s2.encode('utf-8')))
print("s1: bz2\t", bz2.compress(s1.encode('utf-8')))
print("s2: bz2\t", bz2.compress(s2.encode('utf-8')))
print("s1: gzip\t", gzip.compress(s1.encode('utf-8')))
print("s2: gzip\t", gzip.compress(s2.encode('utf-8')))
>>> Python Compression
>>> Same Starters?
s1: zlib	b'x\x9c\x0b\xa8,\xc9\...cc\xcf\x03\x00B\xd5\x075'
s2: zlib	b'x\x9c\x0bN\xccMU\x08.I,*I-*\xb6\x07\x00&i\x05>'
s1: bz2		b'BZh9SY\xffr\x0c\xc...\"\x9c(H\x7f\xb9\x06d\x80'
s2: bz2		b'BZh91AY&xc8\xfc....\xe4\x8ap\xa1!\xd1\x91\xf86'
s1: gzip	b'\x1f\x8b\x08\x00sW\xf0]\...xc3\x12\x00\x00\x00'
s2: gzip	b'\x1f\x8b\x08\x00sW\xf0]\...d2l\x0e\x00\x00\x00'

可以看到,对于不同输入,各个压缩库输出的字节串都各自带有各自的标识头

  • zlib:x\x9c
  • bz2:BZh
  • gzip:\x1f

综上,在处理加密/压缩字节流时,可以通过re等手段查找标识头,确定其压缩方式进行解压缩。


2019/12 Karl

你可能感兴趣的:(Python)