# 13.2。 `gzip` - 支持gzip文件

源代码： Lib/gzip.py

此模块提供了一个简单的接口来压缩和解压缩文件，就像GNU程序gzip和gunzip。

数据压缩由`zlib`模块提供。

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

请注意，可以通过gzip和gunzip程序解压缩的其他文件格式，例如由compress和封装，该模块不支持。

模块定义以下项目：

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

  在二进制或文本模式下打开gzip压缩文件，返回file object。

  filename参数可以是实际的文件名（`str`或`bytes`对象），也可以是要读取或写入的现有文件对象。

  The mode argument can be any of `'r'`, `'rb'`, `'a'`, `'ab'`, `'w'`, `'wb'`, `'x'` or `'xb'` for binary mode, or `'rt'`, `'at'`, `'wt'`, or `'xt'` for text mode. 默认值为`'rb'`。

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

  对于二进制模式，此函数等效于`GzipFile`构造函数：`GzipFile（filename， mode， compresslevel） t6>`。在这种情况下，不能提供编码，错误和新行参数。

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

  Changed in version 3.3: Added support for filename being a file object, support for text mode, and the encoding, errors and newline arguments.

  在版本3.4中更改：添加对`'x'`，`'xb'`和`'xt'`模式的支持。

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`时，文件名参数仅用于包含在gzip可以包括未压缩文件的原始文件名。如果可辨别，它默认为fileobj的文件名；否则，它默认为空字符串，在这种情况下，原始文件名不包括在标题中。

  The mode argument can be any of `'r'`, `'rb'`, `'a'`, `'ab'`, `'w'`, `'wb'`, `'x'`, or `'xb'`, depending on whether the file will be read or written. 如果可辨别，默认为fileobj的模式；否则，默认值为`'rb'`。

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

  compresslevel参数是从`0`到`9`控制压缩级别的整数； `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，使用时间戳。该格式与`os.stat()`返回的对象的`time.time()`和`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`的参数。

`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文件格式。