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

シリアライズモジュール
MarshalとPickleモジュール

Objective

サービスステーションに移動し、JSONモジュールを使用してファイルをフォーマットし、データが正しく保存されていることを確認してください。

道に沿って進むと、将来の収穫のために開発中の土地の水分配と土壌品質を監視するいくつかのステーションが見つかります。データを処理するためには、シリアライズすることが効率的です。JSONを使うことは一般的な解決策として有効ですが、Python特有のシリアライズ方法として、MarshalモジュールとPickleモジュールもあります。Marshalモジュールはデータをバイナリに変換することで高速なシリアライズ/デシリアライズを可能にし、よりシンプルなデータ転送に最適です。Pickleモジュールは速度は遅いものの、より複雑なデータ構造を処理でき、はるかに柔軟で、大規模または重要度の高いデータ構造に適しています。

To use the Marshal and Pickle modules, import their functions by writing: import marshal and import pickle. For our purposes, we’ll be using the following functions:

  • marshal.dumps(): データをバイナリ形式にシリアライズします。Python内での高速化を目的としており、引数にはシリアライズしたいデータを1つ取り、基本的なデータ型に限定されます。
  • marshal.loads(): バイナリデータをPythonで扱えるデータ型にデシリアライズします。機能は限定的ですが高速に実行されます。引数にはデシリアライズするデータを1つ取ります。
  • pickle.DEFAULT_PROTOCOL: Pickleシリアライズのデフォルトプロトコルバージョンを確認します。プロトコルはデータのシリアライズ方式に影響します。
  • pickle.HIGHEST_PROTOCOL: Pickleシリアライズの最高プロトコルバージョンを確認します。プロトコルはデータのシリアライズ方式に影響します。
  • pickle.dumps(): 使用するプロトコルに従って複雑なPythonデータ構造をバイナリ形式でシリアライズします。引数にはシリアライズしたいデータと使用するプロトコルバージョンの2つを取ります。
  • pickle.loads(): バイナリデータをPythonで扱えるデータ型にデシリアライズします。Pythonオブジェクト全般に対応し強力です。引数にはデシリアライズするデータを1つ取ります。

これらのモジュールや関数に加えて、pformatというフォーマット用モジュールも使用します。from pprint import pformat とインポートします。これにより、辞書などのデータ構造を見やすく整形するpformat()関数を使用できます。

まず、小さなモニタリングステーション内のライトXマークまで歩き、コンピュータ端末に向かってください。このステーションは、作物の植え付けのために開発中の近隣地形の水圧と土壌条件を監視しています。readingという定数があり、ステーションが収集したPythonデータが格納されています。

dataという変数を作成し、marshal.dumps()関数の戻り値(引数にreadingを設定)を格納します。例: data = marshal.dumps(reading)。続いて、あらかじめ用意されたdisplay()関数にdata変数を渡して、シリアライズされたデータを表示します。

ステーションを出てゴールドXマークへ向かい、open()関数を使ってドアを開け、オフィスに入ります。端末前のライトXマークまで歩き、先ほどシリアライズしたデータをデシリアライズします。outputという変数を作成し、marshal.loads()(引数に先ほどのdata変数)を格納します。続いて、write()関数にoutputを渡して、モニタリングステーションから取得したデータを確認します。

オフィス内の青いカーペット上のライトXマークまで歩き、端末でプロトコルを確認します。これは、Pickleモジュールがデータ処理時にどのシリアライズ方式を使用するかを判断するためです。あらかじめ用意されたwrite()関数に、pickle.DEFAULT_PROTOCOLpickle.HIGHEST_PROTOCOLを渡してください。これにより、現在のデフォルトプロトコルと、使用可能な最新プロトコルを確認できます。

青いカーペット上のダークXマークへ移動します。プロトコルを確認したので、蓄積されたデータを検証できます。数か月にわたって収集され、samplesという定数に格納されたデータがあります。シリアライズ方法を検証するために、sereal_0sereal_2sereal_5の3つの変数を作成してください。プロトコル0は読みやすいASCII形式で非効率的、プロトコル2はより効率的なバイナリ形式、プロトコル5は最新で最も複雑な機能を備えています。

pickle.dumps()の戻り値を格納し、引数にsamples定数と、変数名に対応するプロトコル番号を指定します。例えばsereal_0の場合、プロトコルを0に設定し、sereal_0 = pickle.dumps(samples, protocol=0)とします。続いて、あらかじめ用意されたdisplay()関数にsereal_0sereal_2sereal_5を渡して、それぞれのプロトコルでのシリアライズ方式の違いを確認してください。

赤いカーペット上のライトXマークまで歩き、端末に向かいます。output変数を上書きし、pickle.loads()の戻り値(引数にsereal_5)を格納して、これまで収集したサンプルデータをデシリアライズします。続いて、display()関数とpformat()関数にoutput変数を渡してデータを表示します。例: await player.display(pformat(output))。表示された各月の評価をメモして、後でグラフ化できるようにしてください。

赤いカーペット上のダークXマークまで歩き、机に向かいます。あらかじめ用意されたwrite()関数に、端末に表示されてメモした各月の評価を追加してください。関数内で指定された正しい順序で、文字列を""で囲むように入力し、レベルを完了させます。

コードブック