12.1. zlib —压缩与 gzip 兼容

对于需要数据压缩的应用程序,此模块中的Function允许使用 zlib 库进行压缩和解压缩。 zlib 库在http://www.zlib.net拥有自己的主页。 Python 模块和低于 1.1.3 的 zlib 库版本之间存在已知的不兼容性; 1.1.3 存在安全漏洞,因此我们建议使用 1.1.4 或更高版本。

zlib 的Function有很多选项,通常需要按特定 Sequences 使用。本文档并不试图涵盖所有排列;有关 Authority 信息,请查阅http://www.zlib.net/manual.html的 zlib 手册。

有关读取和写入.gz文件的信息,请参见gzip模块。

该模块中可用的异常和Function是:

  • exception zlib. error

    • 压缩和解压缩错误引发异常。
  • zlib. adler32(* data * [,* value *])

    • 计算* data 的 Adler-32 校验和。 (Adler-32 校验和几乎与 CRC32 一样可靠,但是可以更快地计算出来.)如果存在 value *,则将其用作校验和的起始值;否则,使用固定的默认值。这允许在几个 Importing 的串联上计算运行中的校验和。该算法在密码学上不强,不应用于身份验证或数字签名。由于该算法旨在用作校验和算法,因此不适合用作常规哈希算法。

此函数始终返回整数对象。

Note

要在所有 Python 版本和平台上生成相同的数值,请使用 adler32(data)和 0xffffffff。如果仅使用打包二进制格式的校验和,则没有必要,因为返回值是正确的 32 位二进制表示形式(与符号无关)。

在 2.6 版中更改:无论平台如何,返回值都在[-2 31,2 31-1]范围内。在旧版本中,该值在某些平台上签名,而在另一些平台上未签名。

在版本 3.0 中更改:无论平台如何,返回值都是无符号的,且范围为[0,2 ** 32-1]。

  • zlib. compress(* string * [,* level *])

    • 压缩* string *中的数据,返回包含压缩数据的字符串。 * level *是从09的整数,用于控制压缩级别; 1最快,产生的压缩最少,9最快,产生的压缩最多。 0是无压缩的。默认值为6。如果发生任何错误,则引发error异常。
  • zlib. compressobj([[* level * [,方法 [,* wbits * [,* memlevel * [,* strategy *]]]]])

    • 返回一个压缩对象,该对象用于压缩一次不适合内存的数据流。 * level *是从09-1的整数,控制压缩级别; 1最快,产生的压缩最少,9最快,产生的压缩最多。 0是无压缩的。默认值为-1(Z_DEFAULT_COMPRESSION)。 Z_DEFAULT_COMPRESSION 表示速度和压缩之间的默认折衷(当前等效于 6 级)。
  • method *是压缩算法。当前,唯一支持的值为DEFLATED

  • wbits *参数控制压缩数据时使用的历史记录缓冲区的大小(或“窗口大小”),以及输出中是否包含标题和尾部。它可以采用多个值范围。默认值为 15.

  • 9 到 15:窗口大小的以 2 为底的对数,因此范围在 512 和 32768 之间。值越大,产生的压缩效果越好,但会占用更多的内存。结果输出将包含特定于 zlib 的标题和尾部。

  • -9 至-15:使用* wbits *的绝对值作为窗口大小的对数,同时生成没有标题或尾随校验和的原始输出流。

  • 25 到 31 = 16(9 到 15):使用该值的低 4 位作为窗口大小的对数,同时在输出中包括基本的 gzip Headers 和尾随校验和。

  • memlevel *控制用于内部压缩状态的内存量。有效值范围是19。较高的值使用更多的内存,但速度更快,并且产生的输出较小。预设值为 8.

  • strategy *用于调整压缩算法。可能的值为Z_DEFAULT_STRATEGYZ_FILTEREDZ_HUFFMAN_ONLY。默认值为Z_DEFAULT_STRATEGY

  • zlib. crc32(* data * [,* value *])
    • 计算* data 的 CRC(循环冗余校验)校验和。如果存在 value *,则将其用作校验和的起始值;否则,将其用作校验和的起始值。否则,使用固定的默认值。这允许在几个 Importing 的串联上计算运行中的校验和。该算法在密码学上不强,不应用于身份验证或数字签名。由于该算法旨在用作校验和算法,因此不适合用作常规哈希算法。

此函数始终返回整数对象。

Note

要在所有 Python 版本和平台上生成相同的数值,请使用 crc32(data)&0xffffffff。如果仅使用打包二进制格式的校验和,则没有必要,因为返回值是正确的 32 位二进制表示形式(与符号无关)。

在 2.6 版中更改:无论平台如何,返回值都在[-2 31,2 31-1]范围内。在旧版本中,该值将在某些平台上签名,而在另一些平台上未签名。

在版本 3.0 中更改:无论平台如何,返回值都是无符号的,且范围为[0,2 ** 32-1]。

  • zlib. decompress(* string * [,* wbits * [,* bufsize *]])
    • 解压缩* string *中的数据,返回包含未压缩数据的字符串。 * wbits 参数取决于 string 的格式,下面将进一步讨论。如果给出 bufsize *,它将用作输出缓冲区的初始大小。如果发生任何错误,则引发error异常。
  • wbits *参数控制历史记录缓冲区的大小(或“窗口大小”),以及期望的标题和尾部格式。它类似于compressobj()的参数,但是接受更多范围的值:
  • 8 到 15:窗口大小的以 2 为底的对数。Importing 必须包含 zlibHeaders 和尾标。

  • 0:根据 zlibHeaders 自动确定窗口大小。从 zlib 1.2.3.5 开始仅受支持。

  • -8 至-15:使用* wbits *的绝对值作为窗口大小的对数。Importing 必须是没有头或尾的原始流。

  • 24 到 31 = 16(8 到 15):使用该值的低 4 位作为窗口大小对数。Importing 必须包含 gzipHeaders 和尾标。

  • 40 到 47 = 32(8 到 15):使用该值的低 4 位作为窗口大小的对数,并自动接受 zlib 或 gzip 格式。

在对流进行解压缩时,窗口大小不得小于最初用于压缩流的大小。使用太小的值可能会导致error异常。 * wbits *的默认值为 15,它对应于最大的窗口大小,并且需要包含 zlibHeaders 和尾标。

  • bufsize *是用于保存解压缩数据的缓冲区的初始大小。如果需要更多空间,缓冲区大小将根据需要增加,因此您不必完全正确地获得此值。调整它只会保存对malloc()的几个呼叫。默认大小为 16384.
  • zlib. decompressobj([* wbits *])
    • 返回一个解压缩对象,用于解压缩一次不适合内存的数据流。
  • wbits *参数控制历史记录缓冲区的大小(或“窗口大小”),以及期望的标题和尾部格式。它的含义与描述了 decompress()相同。

压缩对象支持以下方法:

  • Compress. compress(* string *)

    • 压缩* string ,返回一个字符串,其中包含 string *中至少部分数据的压缩数据。该数据应与先前对compress()方法的任何调用所产生的输出连接起来。某些 Importing 可以保留在内部缓冲区中,以供以后处理。
  • Compress. flush([模式])

    • 处理所有未决的 Importing,并返回包含剩余压缩输出的字符串。可以从常量Z_SYNC_FLUSHZ_FULL_FLUSHZ_FINISH中选择* mode ,默认为Z_FINISHZ_SYNC_FLUSHZ_FULL_FLUSH允许压缩更多的数据字符串,而Z_FINISH完成压缩的流并阻止压缩更多的数据。在 mode *设置为Z_FINISH的情况下调用flush()后,无法再次调用compress()方法;唯一现实的操作是删除对象。
  • Compress. copy ( )

    • 返回压缩对象的副本。这可用于有效压缩共享公共初始前缀的一组数据。

2.5 版的新Function。

解压缩对象支持以下方法和两个属性:

  • Decompress. unused_data
    • 一个字符串,其中包含压缩数据末尾之后的所有字节。也就是说,它保持为"",直到包含压缩数据的最后一个字节可用为止。如果整个字符串包含压缩数据,则为"",即空字符串。

确定压缩数据字符串结束位置的唯一方法是实际对其进行解压缩。这意味着,当压缩数据包含在较大文件的一部分中时,您只能pass读取数据并将其后跟一些非空字符串的数据送入解压缩对象的decompress()方法中找到它的末尾,直到unused_data属性不再为空为止串。

  • Decompress. unconsumed_tail

    • 一个字符串,其中包含上一个decompress()调用未使用的任何数据,因为它超出了未压缩数据缓冲区的限制。 zlib 机器尚未看到此数据,因此必须将其(可能还有其他数据串联)反馈给随后的decompress()方法调用,以获取正确的输出。
  • Decompress. decompress(* string * [,* max_length *])

    • 解压缩* string ,返回一个字符串,其中包含与 string *中的至少一部分数据相对应的未压缩数据。该数据应与先前对decompress()方法的任何调用所产生的输出连接起来。某些 Importing 数据可以保留在内部缓冲区中,以供以后处理。

如果可选参数* max_length 不为零,则返回值将不超过 max_length 。这可能意味着并非所有压缩的 Importing 都可以处理。未使用的数据将存储在属性unconsumed_tail中。如果要 continue 减压,则必须将此字符串传递给对decompress()的后续调用。如果未提供 max_length *,则将整个 Importing 解压缩,并且unconsumed_tail是空字符串。

  • Decompress. flush([* length *])
    • 处理所有未决的 Importing,并返回包含剩余未压缩输出的字符串。调用flush()之后,不能再次调用decompress()方法;否则,不能再调用decompress()方法。唯一现实的操作是删除对象。

可选参数* length *设置输出缓冲区的初始大小。

  • Decompress. copy ( )
    • 返回解压缩对象的副本。这可用于保存数据流中途的解压缩器状态,以加快将来在流中的随机查找。

2.5 版的新Function。

See also