dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[python]オブジェクトのピクル(pickle)化

pythonで開発していたとき、pickleという聞き慣れない単語が出てきたので軽く調べてみた。
ちなみに、pickleという単語を辞書で引くと

  1. ~をピクルス[塩漬け・酢漬け]にする
  2. 〔金属を〕酸洗いする

(SPACE ALCで検索した結果)

ということで訳の分からない感じになるんですが、公式ドキュメントにもきちんと書いてました。
python のバージョンは 2.7)

http://docs.python.jp/2/library/pickle.html

pickle化、非pickle化とは

pythonのオブジェクトをバイトストリームに変換(pickle化)したり、またはその逆の操作でバイトストリームを元のオブジェクトに戻すように変換(非pickle化)すること。
pickleモジュールを使うことで、リストや辞書などの複雑なデータ型をファイルに保存することができるようになります。

つまり、pickleという単語を使ってはいるもののやっていることはシリアライズ(直列化)、デシリアライズ(非直列化)です。

実際、公式ドキュメントにもpickle化の別名として以下の用語を挙げています。

  • 直列化(serialization)
  • 整列化(marshalling)
  • 平坦化(flattening)

やってみる

基本的に、

  • pickle.dump([オブジェクト], [ファイル]): 指定したファイルにオブジェクトを書き出す
  • pickle.load([ファイル]): 指定したファイルからオブジェクトを取り出す

という2つのメソッドだけ覚えればOK

>>> import pickle
>>> obj = ['a', 'b', 123, {'key': 'value'}]
>>> with open('obj.pickle', 'wb') as f:
...     pickle.dump(obj, f)
...

保存するファイルをここではobj.pickleとしましたが、
ファイル名・拡張子は何でもいいです。

作成したobj.pickleの中身はこんな感じです。

(lp0
S'a'
p1
aS'b'
p2
aI123
a(dp3
S'key'
p4
S'value'
p5
sa.

これだけだと何だかわかりませんね。

次は、このファイルからpickle.loadしてみます。

>>> import pickle
>>> with open('obj.pickle', 'rb') as f:
...     obj = pickle.load(f)
...
>>> print obj
['a', 'b', 123, {'key': 'value'}]

はい、無事にオブジェクトを取り出せました。

リファレンス

はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知

python 3 だけど Pythonオブジェクトをシリアライズする - Dive Into Python 3 日本語版

TODO

以下の型は pickle 化できます:

  • NoneTrue 、および False
  • 整数、長整数、浮動小数点数複素数
  • 通常文字列および Unicode 文字列
  • pickle 化可能なオブジェクトからなるタプル、リスト、集合および辞書
  • モジュールのトップレベルで定義されている関数
  • モジュールのトップレベルで定義されている組込み関数
  • モジュールのトップレベルで定義されているクラス
  • __dict__ または __setstate__() を pickle 化できる上記クラスのインスタンス (詳細は pickle 化プロトコル 節を参照してください)