Skip to main content

13.2. gzip —支持 gzip 文件

源代码: Lib/gzip.py


这个模块提供了一个简单的接口来压缩和解压文件,就像GAC程序 gzipgunzip 一样。

数据压缩由 zlib 模块提供。

gzip 模块提供 GzipFile 类,以及 open()compress()decompress() 便利功能。 GzipFile 类读取和写入 gzip -format文件,自动压缩或解压缩数据,使其看起来像一个普通的 file object

请注意,此模块不支持可由 gzipgunzip 程序解压缩的附加文件格式,例如由 compresspack 生成的文件格式。

模块定义以下项目:

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

以二进制或文本模式打开gzip压缩文件,返回 file object

filename 参数可以是实际文件名(strbytes 对象),也可以是要读取或写入的现有文件对象。

mode 参数可以是用于二进制模式的 'r''rb''a''ab''w''wb''x''xb' 中的任何一个,或者对于文本模式是 'rt''at''wt''xt' 中的任何一个。默认值为 'rb'

compresslevel 参数是一个从0到9的整数,对于 GzipFile 构造函数。

对于二进制模式,此函数等同于 GzipFile 构造函数:GzipFile(filename, mode, compresslevel)。在这种情况下,不能提供 encodingerrorsnewline 参数。

对于文本模式,将创建 GzipFile 对象,并将其包装在具有指定编码,错误处理行为和行结尾的 io.TextIOWrapper 实例中。

在 3.3 版更改: 添加了对作为文件对象的 filename 的支持,支持文本模式,以及 encodingerrorsnewline 参数。

在 3.4 版更改: 增加了对 'x''xb''xt' 模式的支持。

在 3.6 版更改: 接受 path-like object

class gzip.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)

GzipFile 类的构造函数,它模拟 file object 的大多数方法,除了 truncate() 方法。 fileobjfilename 中的至少一个必须被赋予非平凡值。

新类实例基于 fileobj,它可以是常规文件,io.BytesIO 对象或任何其他模拟文件的对象。它默认为 None,在这种情况下,filename 被打开以提供一个文件对象。

fileobj 不是 None 时,filename 参数仅用于包括在 gzip 文件头中,其可以包括未压缩文件的原始文件名。如果可辨别,它默认为 fileobj 的文件名;否则,它默认为空字符串,在这种情况下,原始文件名不包括在标题中。

mode 参数可以是 'r''rb''a''ab''w''wb''x''xb' 中的任一个,这取决于文件是否将被读取或写入。默认是 fileobj 的模式,如果可辨别;否则,默认值为 'rb'

请注意,文件始终以二进制模式打开。要在文本模式下打开压缩文件,请使用 open() (或用 io.TextIOWrapper 包装 GzipFile)。

compresslevel 参数是从 09 的整数,控制压缩级别; 1 是最快的并且产生最小的压缩,并且 9 是最慢的并且产生最大的压缩。 0 不压缩。默认值为 9

mtime 参数是要在压缩时写入流中最后一个修改时间字段的可选数字时间戳。它只应在压缩模式下提供。如果省略或 None,则使用当前时间。有关更多详细信息,请参阅 mtime 属性。

调用 GzipFile 对象的 close() 方法不会关闭 fileobj,因为您可能希望在压缩数据之后附加更多材料。这也允许您传递一个 io.BytesIO 对象打开为写为 fileobj,并使用 io.BytesIO 对象的 getvalue() 方法检索生成的内存缓冲区。

GzipFile 支持 io.BufferedIOBase 接口,包括迭代和 with 语句。仅实现 truncate() 方法。

GzipFile 还提供了以下方法和属性:

peek(n)

读取 n 未压缩字节,而不提前文件位置。对压缩流最多只能进行一次读操作以满足调用。返回的字节数可能多于或少于请求的字节数。

注解

当调用 peek() 不改变 GzipFile 的文件位置时,它可以改变底层文件对象的位置(例如,如果 GzipFile 是用 fileobj 参数构造的)。

3.2 新版功能.

mtime

当解压缩时,可以从该属性读取最近读取的报头中的最后修改时间字段的值作为整数。读取任何头之前的初始值是 None

所有 gzip 压缩流都需要包含此时间戳字段。一些程序,如 gunzip ,利用时间戳。格式与 time.time() 的返回值和 os.stat() 返回的对象的 st_mtime 属性相同。

在 3.1 版更改: 增加了对 with 语句的支持,以及 mtime 构造函数参数和 mtime 属性。

在 3.2 版更改: 添加了对零填充和不可搜索文件的支持。

在 3.3 版更改: 现在实现 io.BufferedIOBase.read1() 方法。

在 3.4 版更改: 增加了对 'x''xb' 模式的支持。

在 3.5 版更改: 添加了对任意 字节状对象 的支持。 read() 方法现在接受 None 的参数。

在 3.6 版更改: 接受 path-like object

gzip.compress(data, compresslevel=9)

压缩 data,返回包含压缩数据的 bytes 对象。 compresslevel 具有与上述 GzipFile 构造子中相同的含义。

3.2 新版功能.

gzip.decompress(data)

解压缩 data,返回包含未压缩数据的 bytes 对象。

3.2 新版功能.

13.2.1. 使用示例

如何读取压缩文件的示例:

import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
    file_content = f.read()

如何创建压缩的GZIP文件的示例:

import gzip
content = b"Lots of content here"
with gzip.open('/home/joe/file.txt.gz', 'wb') as f:
    f.write(content)

如何GZIP压缩现有文件的示例:

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

示例如何GZIP压缩二进制字符串:

import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)

参见

模块 zlib

基本数据压缩模块需要支持 gzip 文件格式。