pickleを使う
pickleモジュールを使うと、Pythonのデータ構造(タプルとかリストとかクラスのインスタンスとか)を保存できます。
pickle化がPythonのオブジェクトをバイト列に変換すること、非pickle化はその逆を指します。
Pickle化
dumpを使います。
dump(オブジェクト, ファイルオブジェクト)
第二引数はopen(ファイル名)といった感じで開いたファイルオブジェクトを渡してください。
なお、dumpsを使うと、ファイルに書き込まずに文字列が返されます。
非Pickle化
loadを使います。
load(ファイルオブジェクト)
こちらも、開かれたファイルオブジェクトを渡すようにします。
なお、dumpsで作った文字列を読み込むにはloadsを使います。
例
クラスのインスタンスを保存して、読みだしています。
ここではクラスインスタンスをpickle化してますが、他のデータでもできます。
>>> import pickle >>> >>> # 適当にクラスを作る >>> class hoge: ... def __init__(self, data): ... self.data = data ... >>> h = hoge(10) >>> h.data 10 >>> >>> # Pickle化 >>> f = open('test.txt', 'w') >>> pickle.dump(h, f) >>> f.close() >>> >>> # 非Pickle化 >>> f = open('test.txt') >>> h2 = pickle.load(f) >>> h2 <__main__.hoge instance at 0x0174DCD8> >>> h2.data 10 >>> f.close()
安全性について
調べていたら、Pickleの安全性について言及しているサイトを見つけた。
http://nadiana.com/python-pickle-insecure
pickleモジュールはセキュリティについて何も考慮していないので、非pickle化するデータには細心の注意を払いましょうとのことです。
上記サイトに記されている例ですが、
>||python|
import pickle
pickle.loads("cos\nsystem\n(S'dir'\ntR.") # This will run: dir
|
でdirが実行されてしまいます。
このように、非pickle化はコマンドを実行してしまう可能性があります。
上記サイトでは、その対策が記されていますが、代替としてJSONを使うことなども勧められていました。