13.2. gzip — 支持 gzip 文件 — Python 文档
13.2. 压缩包 - 支持压缩包档案
该模块提供了一个简单的接口来压缩和解压缩文件,就像 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 版更改: 接受 类路径对象 。
- 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 个未压缩字节而不推进文件位置。 最多对压缩流进行一次读取以满足调用。 返回的字节数可能比请求的多或少。
3.2 版中的新功能。
- mtime
解压时,可以从该属性中读取最近读取头中最后修改时间字段的值,作为整数。 读取任何标题之前的初始值是
None
。所有 gzip 压缩流都需要包含此时间戳字段。 某些程序,例如 gunzip,使用时间戳。 格式与time.time()的返回值和os.stat()返回的对象的st_mtime属性相同。
3.2 版更改: 添加了对零填充和不可搜索文件的支持。
3.3 版更改: io.BufferedIOBase.read1() 方法现已实现。
3.4 版更改: 添加了对
'x'
和'xb'
模式的支持。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)