高级 Python 开发课程
第 章
>
第 级

序列化模块
压缩模块

目标

将消息和订单进行压缩,以便归档和传输。

已提交了多个施工指令、货运单和清单,需要传输或归档。虽然可以通过手动发送所有内容来完成此操作,但更好的方式是通过压缩和解压文件,然后存储或发送它们。为此,你可以使用压缩模块来减小文件大小,使信息更易于管理。与之前只使用单一模块的练习不同,我们现在有多个压缩模块可用,并且每个模块提供了少量函数。它们如下所示:

要实现快速压缩速度和较低压缩率,请使用 zlib 模块,方法是添加 import zlib 。在本练习中,我们将使用以下函数:zlib.compress(),它接受一个参数,即你想要压缩的信息。该参数需要以字节(bytes)的形式传入,而非字符串。

要实现中等压缩速度和中等压缩率,请使用 bz2 模块,方法是添加 import bz2。在本练习中,我们将使用以下函数:

  • bz2.compress() , 接受一个参数,即你想要压缩的信息。
  • bz2.decompress() , 接受一个参数,即你想要解压的信息。该参数需要以字节(bytes)的形式传入,而非字符串。

参数需要以字节(bytes)的形式传入,而非字符串。

要实现高压缩率但压缩速度较慢,请使用 lzma 模块,方法是添加 import lzma 。在本练习中,我们将使用以下类和函数:

  • lzma.LZMACompressor() : 用于创建压缩对象的类,可激活压缩器。
  • compress() : 接受一个参数,即你想要压缩的信息。该参数需要以字节(bytes)的形式传入,而非字符串。参数需要以字节(bytes)的形式传入,而非字符串。

除了这些模块外,我们还将使用 bytes() 函数,将字符串转换为字节,这对于压缩很有用。它接受两个参数:要转换的字符串和格式,在本练习中为 'utf-8'

有三个常量包含需要压缩的数据,分别命名为 red_messageblue_messagegreen_message。首先,走到红色地毯上的金色 X 标记处,创建一个名为 red_bytes 的变量。使用 bytes() 函数将 red_message 常量转换为字节格式,以便压缩数据,格式为 'utf-8',例如:red_bytes = bytes(red_message, 'utf-8')

创建一个名为 red_compression 的变量,并存储 zlib.compress() 的返回值。使用 red_bytes 作为参数来压缩数据,如:red_compression = zlib.compress(red_bytes)。数据压缩完成后,使用在代码编辑器中预先编写的 display() 函数,并将 red_messagered_compression 变量作为参数,以读取消息并查看压缩后的数据。

走到红色地毯上的浅色 X 标记处并面朝办公桌,创建两个变量:message_lengthcompression_length。在这两个变量中,我们将使用 len() 函数分别存储压缩前后数据的字符长度。例如,对于 message_length,获取 red_message 的长度,如:message_length = len(red_message)。同样,对 compression_length 存储 red_compression 的长度,如:compression_length = len(red_compression)

一旦两个变量都有值后,使用预先编写的 write() 函数,并将 message_lengthcompression_length 作为参数,以验证压缩前后的大小。这将演示文件相对于未压缩状态的压缩程度。

走到蓝色地毯上的暗色 X 标记处,面向电脑。创建一个名为 blue_bytes 的变量,并以与 red_message 相同的方式使用 bytes() 函数将 blue_message 转换为字节。接着,取 blue_message 常量,通过调用 bz2.compress() 并传入 blue_bytes 参数来压缩数据,如:blue_message = bz2.compress(blue_bytes)

创建一个名为 blue_decompress 的变量,并存储 bz2.decompress() 的返回值,将 blue_message 作为参数传入,以查看解压后的数据。然后,在预先编写的 display() 函数中加入 blue_messageblue _decompress 变量,以查看消息数据的压缩和解压结果。

前往绿色地毯上的暗色 X 标记处,创建一个名为 compressor 的对象,并将其赋值为 lzma.LZMACompressor(),这样就创建了一个可用于 lzma 函数的压缩器对象。然后,创建一个名为 green_bytes 的变量,并以与处理 red_messageblue message 相同的方式使用 bytes() 函数将 green_message 转换为字节格式。

创建一个名为 green_compression 的变量,并将 compressor.compress() 的返回值赋给它,同时传入 green_bytes 作为参数。这样,你就可以使用该压缩器对象对消息数据进行压缩。然后,在预先编写的 display() 函数中加入 green_messagegreen_compression 变量作为参数,以查看消息和压缩后的数据。

走到绿色地毯上的浅色 X 标记处并面朝办公桌,修改名为 message_lengthcompression_length 的两个变量。在这两个变量中,我们将使用 len() 函数存储压缩前后数据的字符长度。对于 message_length,使用 len() 获取 green_message 的长度。对于 compression_length,存储 green_compressionlen()。一旦两个变量都有值后,使用预先编写的 write() 函数,并将 message_lengthcompression_length 作为参数,以验证压缩后的大小并完成本关卡。

代码书