上級Python開発コース
チャプター
>
レベル

シリアライゼーション・モジュール
マーシャルとピックルモジュール

目的

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

道を進むと、将来の収穫に備えて開発されつつある土地のために、水の分配や土壌の質を監視するいくつかのステーションが見つかります。データ処理のためには、データをシリアライズするのが効率的です。Jsonの使用は一般的な解決策として効果的である一方で、Python固有のいくつかのシリアライズ方法、具体的には Marshal と Pickle モジュールも存在します。Marshal モジュールはデータをバイナリに変換して高速なシリアライズ/デシリアライズを実現するよう設計されており、単純なデータ転送に最適です。Pickle モジュールは処理が遅いものの、より複雑なデータ構造を扱うように設計され、はるかに柔軟であり、大量または優先度の高いデータ構造に最適です.

MarshalおよびPickleモジュールを使用するには、import marshalimport pickle を書いてそれらの関数をインポートします。 本例では、以下の関数を使用します:

  • marshal.dumps(): データをバイナリ形式にシリアライズし、Python内での速度を重視して設計されています。シリアライズしたいデータを引数として受け取り、基本的なデータ型に限定されています.
  • marshal.loads(): バイナリデータをPythonで読めるデータ型にデシリアライズします。機能は限定されていますが、実行は高速です。デシリアライズするデータを引数として受け取ります.
  • pickle.DEFAULT_PROTOCOL: 現行のPythonバージョンでPickleシリアライズのデフォルトのプロトコルバージョンを確認します。プロトコルはデータのシリアライズ方法に影響します.
  • pickle.HIGHEST_PROTOCOL: 現行のPythonバージョンでPickleシリアライズに利用可能な最高のプロトコルバージョンを確認します。プロトコルがデータのシリアライズ方法に影響します.
  • pickle.dumps(): プロトコルに従って複雑なPythonデータ構造をバイナリ形式にシリアライズします。シリアライズするデータと使用するプロトコルバージョンという2つの引数を受け取ります.
  • pickle.loads(): バイナリデータをPythonで読めるデータ型にデシリアライズし、Pythonオブジェクトに対して強力な機能を持ちます。デシリアライズするデータを引数として受け取ります.

これらのモジュールおよび関数に加えて、pformatというフォーマット用のモジュールも使用します。from pprint import pformat を使ってインポートします。これにより、辞書のようなデータ構造を整形し、情報を明確に表示するための pformat() 関数を利用することが可能になります.

まず、小さな監視ステーション内の光るXマークまで歩き、コンピューター端末に向かいます。このステーションは、作物の植え付けのために開発されている近隣の地形の水圧や土壌条件を監視しています。reading という定数が存在し、これはステーションによって収集されたPythonデータを含んでいます.

data という変数を作成し、marshal.dumps() 関数の戻り値(引数として reading を設定)を代入します。例えば、data = marshal.dumps(reading) のように記述します。シリアライズされた変数データを確認するために、事前に用意された display() 関数と共に data 変数を使用してください.

ステーションから出て、金色のXマークに向かいます。open() 関数を使用して扉を開き、オフィスに入ってください。端末の前にある光るXマークまで歩き、先ほどシリアライズしたデータをデシリアライズします。output という変数を作成し、前回の data 変数を引数として marshal.loads() の戻り値を代入してください。監視ステーションから収集したシリアライズされたデータにアクセスするために、write() 関数に output を引数として渡してください.

オフィス内の青いカーペットの上にある光るXマークに歩いて行き、端末上でプロトコルを検証して、Pickleモジュールがデータ処理時にどのタイプのシリアライズを行うかを確認します。事前に用意された write() 関数内で、引数を pickle.DEFAULT_PROTOCOL および pickle.HIGHEST_PROTOCOL に設定してください。これにより、現行のシリアライズプロトコルと、現在利用可能な最新のシリアライズプロトコルが検証されます.

青いカーペット上の暗いXマークに向かい、プロトコルが確認できたので、保存されたデータを検証します。数か月にわたって収集・保存されたデータは samples という定数に格納されています。シリアライズに利用可能な3つのプロトコルを検証するため、sereal_0sereal_2、および sereal_5 という3つの変数を作成してください。プロトコル 0 は可読性のあるASCII形式であまり効率的ではなく、プロトコル 2 はより効率的なバイナリ形式、プロトコル 5 は最新で最も複雑な機能が追加されています.

pickle.dumps() の戻り値を格納し、引数として samples 定数および変数名に対応する protocol を設定します。例えば、sereal_0 の場合は protocol0 に設定し、sereal_0 = pickle.dumps(samples, protocol=0) のように記述します。各プロトコルによるシリアライズの違いを検証するため、事前に用意された display() 関数と共に sereal_0sereal_2、および sereal_5 を使用してください.

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

赤いカーペット上の暗いXマークに向かい、机に向かって進み、事前に用意された write() 関数内に、端末に表示された各月の評価を追加してください。レベルを完了するために、関数内で示されている正しい順序で、評価を "" で囲んだ文字列として追加してください.

コードブック