gzip — 支持 gzip 文件 — Python 文档

来自菜鸟教程
Python/docs/3.8/library/gzip
跳转至:导航、​搜索

gzip — 支持 gzip 文件

源代码: :source:`Lib/gzip.py`



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

数据压缩由 zlib 模块提供。

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

请注意,可以由 gzip 和 gunzip 程序解压缩的其他文件格式,例如由 compress 和 pack 生成的文件格式,是此模块不支持。

该模块定义了以下项目:

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

以二进制或文本模式打开 gzip 压缩文件,返回 文件对象 。

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

mode 参数可以是 'r'、'rb'、'a'、'ab'、'w'、'wb'、'x' 或 'xb' 用于二进制模式,或 'rt'、'at'、'wt' 或 ] 用于文本模式。 默认值为 'rb'。

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

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

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

3.3 版更改: 添加了对 filename 作为文件对象的支持,支持文本模式,以及 编码 、 错误 和 [ X160X]newline 参数。

3.4 版更改: 添加了对 'x'、'xb' 和 'xt' 模式的支持。

3.6 版更改: 接受 类路径对象 。

exception gzip.BadGzipFile

为无效的 gzip 文件引发异常。 它继承了 OSError。 EOFError 和 zlib.error 也可以针对无效的 gzip 文件引发。

3.8 版中的新功能。

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

GzipFile 类的构造函数,模拟 文件对象 的大部分方法,truncate() 方法除外。 fileobj 和 filename 中的至少一个必须被赋予一个非平凡的值。

新的类实例基于 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 参数是一个从 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,使用时间戳。 格式与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 版更改: 接受 类路径对象 。

gzip.compress(data, compresslevel=9, *, mtime=None)

压缩 data,返回一个包含压缩数据的 bytes 对象。 compresslevel 和 mtime 与上面的 GzipFile 构造函数具有相同的含义。

3.2 版中的新功能。

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

gzip.decompress(data)

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

3.2 版中的新功能。

使用示例

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

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文件格式所需的基本数据压缩模块。


命令行界面

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

一旦执行,gzip 模块会保存输入文件。

3.8 版变更: 新增命令行界面,有用法。 默认情况下,当您执行 CLI 时,默认压缩级别为 6。


命令行选项

file
如果未指定 file,则从 sys.stdin 读取。
--fast
表示最快的压缩方法(较少的压缩)。
--best
表示最慢的压缩方法(最佳压缩)。
-d, --decompress
解压给定的文件。
-h, --help
显示帮助信息。