Coding for KidsCoding for Kids
创意关卡挑战教师指南
为功能投票
高级 Python 开发课程
第 章
>
第 级

序列化模块
压缩模块

目标

接收消息和指令,对其进行压缩以便存档和传输。

有几份提交的构建说明、运输单和装载单需要传输或存档。虽然可以通过手动发送所有内容来传输,但一个好的方法是压缩和解压文件,然后存储或发送。为此,你可以使用压缩模块来减小文件大小,使信息更易于管理。与我们以往学习并使用单一模块解决的其他问题不同,这里有几个压缩模块可供使用,每个模块都有一小部分函数。它们如下:

对于快速压缩速度和低压缩率,请使用 zlib 模块,通过添加 import zlib 。在我们的例子中,将使用以下函数:zlib.compress() ,该函数使用一个参数,即你想要压缩的信息。参数需要以字节形式输入,而不是字符串。

对于中等压缩速度和中等压缩率,请使用 bz2 模块,通过添加 import bz2 。在我们的例子中,将使用以下函数:

  • bz2.compress() ,使用一个参数,即你想要压缩的信息。
  • bz2.decompress() ,使用一个参数,即你想要解压缩的信息。它需要以字节形式输入,而不是字符串。

参数需要以字节形式输入,而不是字符串。

对于高压缩率但压缩速度慢的情况,请使用 lzma 模块,通过添加 import lzma 。在我们的例子中,将使用以下类和函数:

  • lzma.LZMACompressor() :用于创建压缩对象,允许你激活压缩器的类。
  • compress():使用一个参数,即你想要压缩的信息。它需要以字节形式输入,而不是字符串。参数需要以字节形式输入,而不是字符串。

除了这些模块,我们还将使用 bytes() 函数,它允许你将字符串转换为字节,这在压缩时非常有用。该函数接受两个参数,即你希望转换的字符串和格式,对于我们的例子而言,格式为 'utf-8'

有三个常量包含需要压缩的数据,分别命名为 red_messageblue_messagegreen_message 。首先,沿着红地毯走向金色的 X 标记,创建一个变量命名为 red_bytes 。将 red_message 常量使用 bytes() 函数转换为字节,以便数据可以被压缩,格式为 '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,使用 len(red_message) 获取 red_message 的长度,如这样:message_length = len(red_message) 。同样地,对于 compression_length,存储 red_compression 使用 len() 的结果。

一旦两个变量都被赋值,使用预写的 write() 函数,并将 message_lengthcompression_length 作为参数传入,以验证压缩后的大小。这展示了文件压缩后相对于未压缩状态下的大小变化。

沿着蓝地毯走向深色 X 标记,面向电脑。创建一个变量命名为 blue_bytes ,并使用 bytes() 函数以与处理 red_message 相同的方式将 blue_message 转换为字节。将 blue_message 常量通过存储 bz2.compress() 的返回值来压缩,传入参数 blue_bytes 来压缩数据,如这样:blue_message = bz2.compress(blue_bytes)

接着,创建一个变量命名为 blue_decompress ,存储 bz2.decompress() 的返回值,并传入 blue_message 作为参数以便查看解压后的数据。将 blue_messageblue_decompress 变量添加到预写的 display() 函数中,以便查看消息数据的压缩和解压后的变体。

沿着绿地毯走向深色 X 标记,创建一个对象命名为 compressor ,并将 lzma.LZMACompressor() 赋值给它,这将创建一个可与 lzma 函数一起使用的压缩器对象。创建一个变量命名为 green_bytes ,并使用 bytes() 函数以与处理 red_messageblue_message 相同的方式将 green_message 转换为字节格式。

创建一个变量命名为 green_compression ,并存储 compressor.compress() 的返回值,同时传入 green_bytes 作为参数。这将允许你使用压缩器对象对消息数据进行压缩。在预写的 display() 函数中添加 green_messagegreen_compression 变量作为参数,以便查看消息及其压缩后的数据。

沿着绿地毯走向浅色 X 标记前,面向桌子,修改两个变量命名为:message_lengthcompression_length 。在这两个变量中,我们将使用 len() 函数存储压缩前后数据的字符长度。对于 message_length ,使用 len(green_message) 获取 green_message 的长度。同样,对于 compression_length ,存储 green_compressionlen() 。一旦这两个变量都被赋值,使用预写的 write() 函数,并将 message_lengthcompression_length 作为参数传入,以便验证压缩后的尺寸,完成此关卡。

代码书