Python gzip 模块



我们使用 GZip 应用程序对文件进行压缩和解压缩。它是 GNU 工程的一部分。Python 的 gzip 模块是 GZip 应用程序的接口。gzip 数据压缩算法本身就是基于 zlib 模块的。

gzip 模块包含 GzipFile 类的定义及其方法。它还包含便捷函数 open()、compress() 和 decompress()。

让我们讨论一下这些功能 -

open() 函数

此函数以二进制或文本模式打开 gzip 压缩文件,并返回类似 object 的文件,该对象可以是物理文件、字符串或字节对象。默认情况下,文件以 'rb' 模式打开,即读取二进制数据,但是,此函数的 mode 参数可以采用其他模式,如下所示 -

  • 二进制模式 − 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', 'xb'。
  • 文本模式 − 'rt'、'at'、'wt' 或 'xt'。

此函数还定义可接受值介于 0 到 9 之间的压缩级别。当文件以文本模式打开时,GzipFile 对象将包装在 TextIOWrapper 对象中。

compress() 函数

此函数对作为参数提供给它的数据应用压缩,并返回压缩的字节对象。默认情况下,压缩级别为 9。

decompress() 函数

此函数解压缩 byte 对象并返回未压缩的数据。

以下示例通过在 gzip 文件中写入压缩数据来创建 gzip 文件。


import gzip
data=b'Python - Batteries included'
with gzip.open("test.txt.gz", "wb") as f:
	 	f.write(data)

这将在当前目录中创建 “test.txt.gz” 文件。此 gzip 存档包含“test.txt”,您可以使用任何解压缩实用程序进行验证。

以编程方式读取此压缩文件。


with gzip.open("test.txt.gz", "rb") as f:
	 	print (f.read())

输出

b'Python - Batteries included'

要将现有文件压缩为 gzip 存档,请读取其中的文本并将其转换为 bytearray。然后,此 bytearray 对象将写入 gzip 文件。在下面的示例中,假定 'zen.txt' 文件存在于当前目录中。


fp=open("zen.txt","rb")
data=fp.read()
bindata=bytearray(data)
with gzip.open("zen.txt.gz", "wb") as f:
	 	f.write(bindata)

从 gzip 存档中检索未压缩的文件。


fp=open("zen1.txt", "wb")
with gzip.open("zen.txt.gz", "rb") as f:
	 	bindata=f.read()
fp.write(bindata)
fp.close()

上面的代码将在当前目录中创建 'zen1.txt',其中包含与 'zen.txt' 相同的数据。

除了这些方便的功能外,gzip 模块还具有 GzipFile 类,它定义了 compress() 和 decompress() 方法。此类的构造函数采用 file、mode 和 compressionlevel 参数,其含义与上述完全相同。

当 mode 参数为 'w' 或 'wb' 或 'wt' 时,GipFile 对象将提供 write() 方法来压缩给定的数据并写入 gzip 文件。


f=gzip.GzipFile("testnew.txt.gz","wb")
data=b'Python - Batteries included'
f.write(data)
f.close()

这将创建一个 testnew.txt.gz 文件。您可以使用任何实用程序将其解压缩,以查看它是否包含带有 'Python − Batteries included' 文本的testnew.txt。

要使用 GzipFile 对象解压缩 gzip 文件,请使用 'rb' 值到 mode 参数创建它,并通过 read() 方法读取未压缩的数据。


f=gzip.GzipFile("testnew.txt.gz","rb")
data=f.read()
print (data)