pythonで開発していたとき、pickleという聞き慣れない単語が出てきたので軽く調べてみた。
ちなみに、pickleという単語を辞書で引くと
- ~をピクルス[塩漬け・酢漬け]にする
- 〔金属を〕酸洗いする
(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 化できるもの、できないものの整理
以下の型は pickle 化できます:
- 自作クラスの pickle 化定義