2013/05/06

ライブラリ:pickle

Pythonの「pickle」というライブラリについてご紹介します。

import pickle

「pickle」は、Pythonオブジェクトをファイルに保存するためのライブラリです。保存したものをまた読み出してくるための関数もあわせて用意されています。

私の認識だと、ただ「ファイルに保存するためのもの」という感じなのですが、OOPではこの処理を「シリアライズ(serialize)」「デシリアライズ(deserialize)」と呼ぶそうです(Wikipedia)。

ちなみに、pickleは「ピクルス」のピクルでいわゆる「漬物」のこと。オブジェクトを漬けるというたとえでしょうか。

pickleの使い方はとてもシンプルです。以下、pickleの使い方について述べてみます。

オブジェクトをファイルに保存する

pickleでファイルに保存するには、pickle.dump()を使います。
mydict = {1: 'Pochi',
          2: 'Taro',
          3: 'Jiro'}
with open('xxx.dump', 'w') as f:
    pickle.dump(f, mydict)

2つの引数のうち、最初のもの(f)は「書き込む可能なファイルオブジェクト」、ふたつめ(mydict)には「保存したいオブジェクト」を指定します。

追記: 上のコードおよび説明が間違っておりました。正しくは、 pickle.dump() に渡す 2 つの引数は、最初の引数が「保存したいオブジェクト」で 2 つめが「書き込み可能なファイルオブジェクト」です。ですので該当行も次のとおりにするのが正解です。

with open('xxx.dump', 'w') as f:
    pickle.dump(mydict, f)

こうすると、「xxx.dump」というファイルが作られ、この中にmydictがシリアライズされて保存されます。

オブジェクトをファイルから読み出す

いったんpickleしたオブジェクトをファイルから再び取り出すには、pickle.load()を使います。
with open('xxx.dump', 'r') as f:
    mydict_load = pickle.load(f)
    print mydict_load  # {1: 'Pochi', 2: 'Taro', 3: 'Jiro'}

引数には、読み込む可能なファイルオブジェクトを渡します。

メインはこのdump()とload()の2つで、あとは、これをファイルではなく文字列にしたい場合のためのdumps()、loads()などが用意されている形です。


今回は辞書型のオブジェクトを使いましたが、pickleではほかにもさまざまなオブジェクトを扱うことができます。公式ドキュメントによるとpickle可能なものとして次のものが挙げられています。
  • None True False
  • 整数型 浮動小数点型 複素数型
  • 文字列
  • タプル リスト セット 辞書
  • モジュールのトップレベルで定義された関数
  • モジュールのトップレベルで定義されたビルトイン関数
  • モジュールのトップレベルで定義されたクラス
  • __dict__がpickle可能なインスタンス

・・・以上です。


インストール
「pickle」は標準ライブラリに含まれているので、Pythonと別途インストールする必要はありません。


参考
pickle - Python公式ドキュメント
Pythonオブジェクトをシリアライズする - Dive Into Python 3 日本語版

0 件のコメント: