高度なPython開発コース
チャプター
>
レベル

シリアライゼーションモジュール
圧縮モジュール

目的

メッセージや注文を受け取り、アーカイブや送信のために圧縮する。

提出された建設指示、出荷、マニフェストがいくつかあり、転送またはアーカイブする必要があります。これらは手動で送信することもできますが、ファイルを圧縮・解凍してから保存または送信するほうが効率的です。これには、ファイルサイズを減らして情報を管理しやすくする圧縮モジュールを使用します。これまでに学んで使ってきた単一のモジュールとは異なり、小さな関数群を持つ複数の圧縮モジュールを使用できます。それらは以下のとおりです:

高速な圧縮速度かつ低い圧縮率が必要な場合はimport zlibzlibモジュールを使用します。ここでは次の関数を使用します: zlib.compress()。引数は圧縮したいデータで、文字列ではなくバイト形式で渡す必要があります。

中程度の圧縮速度・圧縮率が必要な場合はimport bz2bz2モジュールを使用します。ここでは次の関数を使用します:

  • bz2.compress()、引数は圧縮したいデータです。
  • bz2.decompress()、引数は展開したいデータです。 いずれも文字列ではなくバイト形式で渡す必要があります。

高い圧縮率だが圧縮速度が遅い場合はimport lzmalzmaモジュールを使用します。ここでは次のクラスと関数を使用します:

  • lzma.LZMACompressor() : 圧縮オブジェクトを作成するクラスです。
  • compress() : 引数は圧縮したいデータで、文字列ではなくバイト形式で渡す必要があります。

これらのモジュールに加えて、bytes()関数を使用し、文字列をバイトに変換します。引数は変換したい文字列とフォーマット(ここでは'utf-8')の2つです。

圧縮対象となるデータを含む定数が3つあり、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という2つの変数を作成します。これらの変数には、len()関数を使って圧縮前と圧縮後のデータ長を格納します。例えば、message_length = len(red_message)compression_length = len(red_compression)のようにします。

両方の変数が設定されたら、あらかじめ用意されたwrite()関数を使用し、message_lengthcompression_lengthを引数として渡して、圧縮サイズを確認します。これにより、未圧縮時と比べてどれだけ圧縮されているかが分かります。

青いカーペットの上にある暗いX印まで進み、コンピュータに向かってください。blue_bytesという変数を作成し、blue_messagebytes()関数でバイト形式に変換します。次に、bz2.compress()の戻り値を格納する変数blue_messageを作成し、引数にblue_bytesを渡してデータを圧縮します。以下のように記述します: blue_message = bz2.compress(blue_bytes)

blue_decompressという変数を作成し、bz2.decompress()の戻り値を格納してデータを展開します。あらかじめ用意されたdisplay()関数にblue_messageblue _decompressを渡して、圧縮版と展開版のデータを表示します。

緑のカーペットの上にある暗いX印まで進み、compressorというオブジェクトを作成してlzma.LZMACompressor()を割り当てます。これにより、圧縮オブジェクトが作成されます。次に、green_bytesという変数を作成し、green_messageをこれまでと同様にbytes()関数でバイト形式に変換します。

green_compressionという変数を作成し、compressor.compress()の戻り値を格納します。引数にgreen_bytesを渡してメッセージを圧縮します。あらかじめ用意されたdisplay()関数にgreen_messagegreen_compressionを渡して、メッセージと圧縮データを表示します。

緑のカーペットの上にある淡いX印まで進み、机に向かってください。message_lengthcompression_lengthという2つの変数を、先ほどと同様にlen()関数を使って圧縮前後のデータ長を格納するよう修正します。message_lengthにはlen(green_message)compression_lengthにはlen(green_compression)を設定します。両方の変数が設定されたら、あらかじめ用意されたwrite()関数を使用し、message_lengthcompression_lengthを引数として渡して圧縮サイズを確認し、レベルを終了します。

コードブック