13.2. gzip — 支持 gzip 文件 — Python 文档

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

13.2. 压缩包 - 支持压缩包档案

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



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

数据压缩由 zlib 模块提供。

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

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

该模块定义了以下项目:

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

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

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

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

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

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

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

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

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

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

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

GzipFile 类的构造函数,模拟 文件对象 的大部分方法,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 版更改: 接受 类路径对象

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