gzip —支持 gzip 文件

源代码: Lib/gzip.py


该模块提供了一个简单的界面来压缩和解 zipfile,就像 GNU 程序 gzipgunzip 一样。

数据压缩由zlib模块提供。

gzip模块提供GzipFile类以及open()compress()decompress()便利Function。 GzipFile类读写 gzip 格式的文件,自动压缩或解压缩数据,使其看起来像普通的file object

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

该模块定义以下各项:

  • gzip. open(* filename mode ='rb' compresslevel = 9 encoding = None errors = None newline = None *)
    • 以二进制或文本模式打开 gzipzipfile,并返回file object
  • filename *参数可以是实际的文件名(strbytes对象),也可以是要读取或写入的现有文件对象。

  • mode *参数对于二进制模式可以是'r''rb''a''ab''w''wb''x''xb'之一,对于文本模式则可以是'rt''at''wt''xt'。默认值为'rb'

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

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

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

在版本 3.3 中进行了更改:添加了对* filename 作为文件对象的支持,对文本模式的支持以及 encoding errors newline *参数。

在版本 3.4 中进行了更改:添加了对'x''xb''xt'模式的支持。

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

  • exception gzip. BadGzipFile

3.8 版的新Function。

    • class * gzip. GzipFile(* filename = None mode = None compresslevel = 9 fileobj = None mtime = None *)
    • GzipFile类的构造方法,它模拟file object的大多数方法,但truncate()方法除外。必须为* fileobj filename *中的至少一个赋予平凡的值。

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

如果* fileobj 不是None,则 filename 参数仅用于包含在 gzip 文件头中,该文件头可能包含未 zipfile 的原始文件名。如果可以识别,则默认为 fileobj *的文件名;否则,它默认为空字符串,在这种情况下,原始文件名不包含在标题中。

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

请注意,该文件始终以二进制模式打开。要以文本模式打开 zipfile,请使用open()(或用io.TextIOWrapper包裹GzipFile)。

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

  • mtime *参数是可选的数字时间戳,压缩时将写入流中的最后修改时间字段。仅应在压缩模式下提供。如果Ellipsis或None,则使用当前时间。有关更多详细信息,请参见mtime属性。

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

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

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

  • peek(* n *)
    • 读取* n *个未压缩的字节,而无需提前文件位置。最多只能对压缩流进行一次读取才能满足调用要求。返回的字节数可能大于或小于请求的字节数。

Note

虽然调用peek()不会更改GzipFile的文件位置,但可能会更改基础文件对象的位置(例如GzipFile是使用* fileobj *参数构造的)。

3.2 版中的新Function。

  • 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 中进行了更改:添加了对写入任意bytes-like objects的支持。 read()方法现在接受参数None

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

  • gzip. compress(* data compresslevel = 9 **,* mtime = None *)
    • 压缩* data *,返回一个包含压缩数据的bytes对象。 * compresslevel mtime *具有与上面GzipFile构造函数相同的含义。

3.2 版中的新Function。

在 3.8 版中进行了更改:添加了* mtime *参数以实现可重现的输出。

  • gzip. decompress(* data *)
    • 解压缩* data *,返回包含未压缩数据的bytes对象。

3.2 版中的新Function。

用法示例

如何读取 zipfile 的示例:

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)

See also

  • Module zlib

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

命令行界面

gzip模块提供了一个简单的命令行界面来压缩或解 zipfile。

一旦执行,gzip模块将保留 Importing 文件。

在 3.8 版中进行了更改:添加具有用法的新命令行界面。默认情况下,执行 CLI 时,默认压缩级别为 6.

命令行选项

  • file ``

    • 如果未指定* file *,请从sys.stdin读取。
  • --fast ``

    • 表示最快的压缩方法(较少压缩)。
  • --best ``

    • 指示最慢的压缩方法(最佳压缩)。
  • -d `,` `--decompress`

    • 解压缩给定的文件。
  • -h `,` `--help`

    • 显示帮助信息。