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 一样可靠,但可以更快地计算出来.)结果是一个无符号的 32 位整数。如果存在 value ,则将其用作校验和的起始值;否则,将其用作校验和的起始值。否则,将使用默认值 1.传递 value *可以计算多个 Importing 的串联运行校验和。该算法在密码学上不强,不应用于身份验证或数字签名。由于该算法旨在用作校验和算法,因此不适合用作常规哈希算法。

在版本 3.0 中更改:始终返回无符号值。要在所有 Python 版本和平台上生成相同的数值,请使用adler32(data) & 0xffffffff

  • zlib. compress(* data level = -1 *)
    • 压缩* data *中的字节,返回包含压缩数据的 bytes 对象。 * level *是从09-1的整数,用于控制压缩级别; 1(Z_BEST_SPEED)最快,产生的压缩最少,9(Z_BEST_COMPRESSION)最快,产生最大的压缩。 0(Z_NO_COMPRESSION)未压缩。默认值为-1(Z_DEFAULT_COMPRESSION)。 Z_DEFAULT_COMPRESSION 表示速度和压缩之间的默认折衷(当前等效于 6 级)。如果发生任何错误,则引发error异常。

在 3.6 版中进行了更改:* level *现在可以用作关键字参数。

  • zlib. compressobj(* level = -1 method = DEFLATED wbits = MAX_WBITS memLevel = DEF_MEM_LEVEL strategy = Z_DEFAULT_STRATEGY * [,* zdict *])
    • 返回一个压缩对象,该对象用于压缩一次不适合内存的数据流。
  • level *是压缩级别– 09-1的整数。 1(Z_BEST_SPEED)的值最快,产生的压缩最少,而9(Z_BEST_COMPRESSION)的值最慢,产生的最多。 0(Z_NO_COMPRESSION)未压缩。默认值为-1(Z_DEFAULT_COMPRESSION)。 Z_DEFAULT_COMPRESSION 表示速度和压缩之间的默认折衷(当前等效于 6 级)。

  • method *是压缩算法。当前,唯一支持的值为DEFLATED

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

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

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

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

  • memLevel *参数控制用于内部压缩状态的内存量。有效值范围是19。较高的值使用更多的内存,但速度更快,并产生较小的输出。

  • strategy *用于调整压缩算法。可能的值为Z_DEFAULT_STRATEGYZ_FILTEREDZ_HUFFMAN_ONLYZ_RLE(zlib 1.2.0.1)和Z_FIXED(zlib 1.2.2.2)。

  • zdict *是 sched 义的压缩字典。这是一个字节序列(例如bytes对象),包含要在要压缩的数据中频繁出现的子序列。那些最常见的子序列应该出现在字典的末尾。

在版本 3.3 中进行了更改:添加了* zdict *参数和关键字参数支持。

  • zlib. crc32(* data * [,* value *])
    • 计算* data 的 CRC(循环冗余校验)校验和。结果是一个无符号的 32 位整数。如果存在 value ,则将其用作校验和的起始值;否则,将其用作校验和的起始值。否则,将使用默认值 0.传递 value *可以计算多个 Importing 的串联运行校验和。该算法在密码学上不强,不应用于身份验证或数字签名。由于该算法旨在用作校验和算法,因此不适合用作常规哈希算法。

在版本 3.0 中更改:始终返回无符号值。要在所有 Python 版本和平台上生成相同的数值,请使用crc32(data) & 0xffffffff

  • zlib. decompress(* data wbits = MAX_WBITS bufsize = DEF_BUF_SIZE *)
    • 解压缩* data *中的字节,返回包含未压缩数据的 bytes 对象。 * wbits 参数取决于 data 的格式,下面将进一步讨论。如果给出 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 *值对应于最大的窗口大小,并且需要包含 zlibHeaders 和尾标。

  • bufsize *是用于保存解压缩数据的缓冲区的初始大小。如果需要更多空间,缓冲区大小将根据需要增加,因此您不必完全正确地获得此值。调整它只会保存对malloc()的几个呼叫。

在版本 3.6 中更改:* wbits bufsize *可用作关键字参数。

  • zlib. decompressobj(* wbits = MAX_WBITS * [,* zdict *])
    • 返回一个解压缩对象,用于解压缩一次不适合内存的数据流。
  • wbits *参数控制历史记录缓冲区的大小(或“窗口大小”),以及期望的标题和尾部格式。它的含义与描述了 decompress()相同。

  • zdict *参数指定 sched 义的压缩字典。如果提供的话,它必须与产生要解压缩数据的压缩器使用的字典相同。

Note

如果* zdict *是可变对象(例如bytearray),则不得在对decompressobj()的调用与对解压缩器的decompress()方法的第一次调用之间修改其内容。

在版本 3.3 中进行了更改:添加了* zdict *参数。

压缩对象支持以下方法:

  • Compress. compress(* data *)

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

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

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

在 3.8 版中进行了更改:为压缩对象添加了copy.copy()copy.deepcopy()支持。

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

  • Decompress. unused_data

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

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

    • 一个布尔值,指示是否已到达压缩数据流的末尾。

这样就可以区分格式正确的压缩流和不完整或截断的压缩流。

版本 3.3 中的新Function。

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

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

在版本 3.6 中更改:* max_length *可用作关键字参数。

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

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

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

在 3.8 版中进行了更改:为解压缩对象添加了copy.copy()copy.deepcopy()支持。

可pass以下常量获得有关正在使用的 zlib 库版本的信息:

  • zlib. ZLIB_VERSION

    • 用于构建模块的 zlib 库的版本字符串。这可能与运行时实际使用的 zlib 库有所不同,zlib 库可以作为ZLIB_RUNTIME_VERSION使用。
  • zlib. ZLIB_RUNTIME_VERSION

    • 解释器实际加载的 zlib 库的版本字符串。

版本 3.3 中的新Function。

See also