13.2。 gzip - 支持gzip文件

源代码: Lib/gzip.py

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

数据压缩由zlib模块提供。

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

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

模块定义以下项目:

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

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

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

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()方法除外。必须为fileobjfilename中的至少一个赋予一个不重要的值。

新类实例基于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参数是从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,使用时间戳。该格式与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文件格式。