[Python] GZip模块压缩与解压缩

MNIST数据集的原始格式是.gz为后缀的压缩文件,为了更好地理解MNIST数据集的内容,特意学习一下Python的GZip模块。

概述

Python的gzip模块提供了一个简单的接口用于压缩和解压缩文件,其作用类似于UNIX下的GNU程序gzipgunzip。gzip数据压缩的功能是由zlib模块提供的。

说明:gzip模块不支持UNIX下的gzip命令或者gunzip命令所支持的其它压缩格式。

gzip模块提供了几个非常简单、方便的函数接口,如open()compress()decompress()。除此之外,还提供给了一个类GzipFile,该类读/写gzip格式的文件的时候,会自动地对数据进行解压缩/压缩,因此表面上看起来就像一个普通的文件对象的读写。

我们先看下各个函数的功能,然后再举例说明。

open

open函数用于打开一个gzip压缩的文件,可以以二进制模式,也可以以文本模式,它返回一个文件对象(file object),其函数原型是:

1
open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

我们通常只关心前两个参数,即:

  • filename,待打开的文件名。
  • mode,打开模式,默认是’rb’,支持的模式包括:
    • 二进制格式的模式,’r’, ‘rb’, ‘a’, ‘ab’, ‘w’, ‘wb’, ‘x’,’xb’
    • 文本格式的模式,’rt’, ‘at’, ‘wt’, ‘xt’

compress

compress函数用于压缩数据,并返回包含压缩后的数据的bytes类型的对象,其函数原型是:

1
compress(data, compresslevel=9)

decompress

decompress函数用于对数据进行解压缩,并返回包含解压缩后的数据的bytes类型的对象,其函数原型是:

1
decompress(data)

例子:创建GZIP压缩文件

1
2
3
4
import gzip
content = b'Lots of content here'
with gzip.open('./test.txt.gz', 'wb') as f:
f.write(content)

需要注意的一点:write()函数写入的内容必须是字节流对象,或者bytes-like object。如果直接传递给它一个字符串,则会抛出错误。

例子:读取GZIP压缩文件

1
2
3
4
import gzip
with gzip.open('./test.txt.gz', 'rb') as f:
file_content = f.read()
print(flie_content)

程序输出:

1
b'Lots of content here'

例子:对已存在的文件进行压缩

1
2
3
4
5
6
import gzip
import shutil

with open('./file.txt', 'rb') as f_in:
with open('./file.txt.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)

例子:读取MNIST数据集

先在这里下载MNIST测试集的标签文件t10k-labels-idx1-ubyte.gz:

1
$ wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

然后用gzip模块读取其内容:

1
2
3
4
import gzip

with gzip.open('t10k-labels-idx1-ubyte.gz', 'rb') as f:
print(f.read(4))

程序输出:

1
b'\x00\x00\x08\x01'

Great!这就是MNIST测试集标签的前4个字节的数据!