Python gzip模块
我们使用GZip应用程序对文件进行压缩和解压缩。它是GNU项目的一部分。Python的gzip模块是与GZip应用程序的接口。gzip数据压缩算法本身是基于zlib模块。
gzip模块包含了GzipFile类及其方法的定义。它还包含了open()、compress()和decompress()的便捷函数。
让我们讨论这些函数:
open()函数
此函数以二进制或文本模式打开gzip压缩文件,并返回一个文件对象,可以是实际文件、字符串或字节对象。默认情况下,文件以’rb’模式打开,即读取二进制数据,但是,此函数的mode参数可以接受其他模式,如下所示:
- 二进制模式 - ‘r’、’rb’、’a’、’ab’、’w’、’wb’、’x’、’xb’。
-
文本模式 - ‘rt’、’at’、’wt’、或’xt’。
此函数还定义了可接受值为0到9之间的压缩级别。当以文本模式打开文件时,GzipFile对象被包装在TextIOWrapper对象中。
compress()函数
此函数对给定的数据应用压缩,并返回压缩后的字节对象。默认压缩级别为9。
decompress()函数
此函数将字节对象解压缩,并返回解压缩后的数据。
以下示例通过将压缩数据写入其中来创建一个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存档,读取其中的文本并将其转换为字节数组。然后将此字节数组对象写入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()方法。这个类的构造函数接受文件、模式和压缩级别参数,含义与上述相同。
当模式参数给定为’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文件。您可以使用任何工具解压缩它,以查看其中包含的testnew.txt文件中的’Python – Batteries included’文本。
要使用GzipFile对象解压缩gzip文件,请使用’rb’值创建它,并通过read()方法读取未压缩的数据。
f=gzip.GzipFile("testnew.txt.gz","rb")
data=f.read()
print (data)