高度なPython開発コース
チャプター
>
レベル
シリアライゼーションモジュール
圧縮モジュール
目的
メッセージや注文を受け取り、アーカイブや送信のために圧縮する。
提出された建設指示、出荷、マニフェストがいくつかあり、転送またはアーカイブする必要があります。これらは手動で送信することもできますが、ファイルを圧縮・解凍してから保存または送信するほうが効率的です。これには、ファイルサイズを減らして情報を管理しやすくする圧縮モジュールを使用します。これまでに学んで使ってきた単一のモジュールとは異なり、小さな関数群を持つ複数の圧縮モジュールを使用できます。それらは以下のとおりです:
高速な圧縮速度かつ低い圧縮率が必要な場合はimport zlibでzlibモジュールを使用します。ここでは次の関数を使用します: zlib.compress()。引数は圧縮したいデータで、文字列ではなくバイト形式で渡す必要があります。
中程度の圧縮速度・圧縮率が必要な場合はimport bz2でbz2モジュールを使用します。ここでは次の関数を使用します:
bz2.compress()、引数は圧縮したいデータです。bz2.decompress()、引数は展開したいデータです。 いずれも文字列ではなくバイト形式で渡す必要があります。
高い圧縮率だが圧縮速度が遅い場合はimport lzmaでlzmaモジュールを使用します。ここでは次のクラスと関数を使用します:
lzma.LZMACompressor(): 圧縮オブジェクトを作成するクラスです。compress(): 引数は圧縮したいデータで、文字列ではなくバイト形式で渡す必要があります。
これらのモジュールに加えて、bytes()関数を使用し、文字列をバイトに変換します。引数は変換したい文字列とフォーマット(ここでは'utf-8')の2つです。
圧縮対象となるデータを含む定数が3つあり、red_message、blue_message、green_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_messageとred_compressionを引数として渡すことで、メッセージと圧縮データを表示します。
次に、赤いカーペットの上にある淡いX印まで進み、机に向かってください。message_lengthとcompression_lengthという2つの変数を作成します。これらの変数には、len()関数を使って圧縮前と圧縮後のデータ長を格納します。例えば、message_length = len(red_message)、compression_length = len(red_compression)のようにします。
両方の変数が設定されたら、あらかじめ用意されたwrite()関数を使用し、message_lengthとcompression_lengthを引数として渡して、圧縮サイズを確認します。これにより、未圧縮時と比べてどれだけ圧縮されているかが分かります。
青いカーペットの上にある暗いX印まで進み、コンピュータに向かってください。blue_bytesという変数を作成し、blue_messageをbytes()関数でバイト形式に変換します。次に、bz2.compress()の戻り値を格納する変数blue_messageを作成し、引数にblue_bytesを渡してデータを圧縮します。以下のように記述します: blue_message = bz2.compress(blue_bytes)。
blue_decompressという変数を作成し、bz2.decompress()の戻り値を格納してデータを展開します。あらかじめ用意されたdisplay()関数にblue_messageとblue _decompressを渡して、圧縮版と展開版のデータを表示します。
緑のカーペットの上にある暗いX印まで進み、compressorというオブジェクトを作成してlzma.LZMACompressor()を割り当てます。これにより、圧縮オブジェクトが作成されます。次に、green_bytesという変数を作成し、green_messageをこれまでと同様にbytes()関数でバイト形式に変換します。
green_compressionという変数を作成し、compressor.compress()の戻り値を格納します。引数にgreen_bytesを渡してメッセージを圧縮します。あらかじめ用意されたdisplay()関数にgreen_messageとgreen_compressionを渡して、メッセージと圧縮データを表示します。
緑のカーペットの上にある淡いX印まで進み、机に向かってください。message_lengthとcompression_lengthという2つの変数を、先ほどと同様にlen()関数を使って圧縮前後のデータ長を格納するよう修正します。message_lengthにはlen(green_message)、compression_lengthにはlen(green_compression)を設定します。両方の変数が設定されたら、あらかじめ用意されたwrite()関数を使用し、message_lengthとcompression_lengthを引数として渡して圧縮サイズを確認し、レベルを終了します。