文章目录
- 初步认识
- 压缩和解压缩函数
初步认识
gzip是用于处理gzip格式的模块,相当于是zlib模块面向文件的一个应用,其最常用的函数为open。
有了open,那就得演示一下文件读写
import gzip
with gzip.open('test.txt.gz', 'wb') as f:
f.write("压缩文件测试".encode('utf8'))
效果为

其中wb表示写入二进制,相应地,rb就是读取二进制
with gzip.open('test.txt.gz', 'rb') as f:
print(f.read().decode('utf-8'))
# 压缩文件测试
这里面需要注意的是,由于读写时采用了二进制的形式,所以写入文件时进行了编码;读取时进行了解码。
open的完整定义为
gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)
其中,mode有如下几种
| 类别 | 参数 |
|---|---|
| 二进制 | r, rb; a, ab; w, wb; x, xb |
| 文本 | rt, at, wt, xt |
其中,r表示读取;w表示写入;a表示追加;x表示新建并写入,如果文件已经存在,则报错。
compresslevel表示压缩程度,其取值在zlib中有定义,下面是zlib模块中内置的四个常量。
| 压缩模式 | ||
|---|---|---|
| 1 | Z_BEST_SPEED | 最快速度和最低压缩率 |
| 9 | Z_BEST_COMPRESSION | 最慢速度最高压缩率 |
| 0 | Z_NO_COMPRESSION | 不压缩 |
| -1 | Z_DEFAULT_COMPRESSION | 一般相当于设压缩等级为6 |
gzip.open的返回值是一个GzipFile文件,其构造函数为
gzip.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)
GzipFile的构造函数中,除了fileobj和mtime之外,与gzip.open在二进制模式下的表现是完全相同的。其中,fileobj表示文件标识,mtime表示文件的创建时间。
GzipFile类还封装了如下函数
peek(n)可在不移动文件指针的情况下读取n个未压缩字节。
压缩和解压缩函数
最后zlib中封装了必备的压缩和解压缩函数
compress(data, compresslevel=9, *, mtime=None)压缩data,返回值为二进制对象。decompress(data)解压缩data,返回未压缩数据的 bytes 对象。
例如
import sys
ori = 'ifyoumissthetrainimonyouwillknowthatiamgone'*10
bOri = ori.encode()
sys.getsizeof(bOri) # 463
c = gzip.compress(bOri)
sys.getsizeof(c) # 102
即经过gzip.compress压缩之后,字符串由463字节变成了102字节。
如果调整压缩层级
ori = 'if you miss the train i\'m on you will know that i am gone'*100
bOri = ori.encode()
for i in range(10):
c = gzip.compress(bOri, compresslevel=i)
print(i, sys.getsizeof(c))
'''返回结果如下
0 5756
1 159
2 155
3 155
4 131
5 131
6 131
7 131
8 131
9 131
'''



















