文章目录
- 初步认识
- 压缩和解压缩函数
初步认识
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
'''