pickle モジュールを使用すると、オブジェクトを保存することができる
Python にて、辞書型のデータをローカル上に保存する処理を作成する際に、
「あれ?どうやって保存するんだ?」と疑問に思い、調べた結果、
pickle
モジュールの存在を初めて知ったので、学習ノートとして残しておきます。(最終的に JSON に保存しました)
要約
- pickle モジュールを使用すると、オブジェクトを別ファイルにバイナリ形式として保存することができる。
- しかし、pickle モジュールはセキュリティ的観点より、使用はあまり推奨されていない。
- また、保存したファイルは Python 固有のものである。
pickle モジュールについて
pickle モジュールを利用するとオブジェクトをバイナリ形式でファイルに保存することができます。
pickle モジュールは Python オブジェクトの直列化および直列化されたオブジェクトの復元のためのバイナリプロトコルを実装しています。
Python公式ドキュメント:pickle
ちなみに「pickle」とは、「漬物」という意味だそうです。すぐに消えてしまうオブジェクトを保存するということから来ているのでしょうか。なんかかっこいい
pickle モジュールを使ってみる
ファイル作成
バイナリ形式の書き込みモードでファイルを開き、保存したいオブジェクトをpickle.dump()
ですれば、保存できます。
import pickle
d = {"name":"ndj", "age":25, "hobby": "YouTube"}
with open("sample.pickle", mode="wb") as f:
pickle.dump(d, f)
ファイル読み込み
バイナリ形式の読み込みモードでファイルを開き、pickle.load
すれば読み込めます。
import pickle
d = {}
with open("sample.pickle", mode="rb") as f:
d = pickle.load(f)
辞書型以外のオブジェクトも保存することができる
ちなみに辞書型以外のオブジェクトも同様の方法で保存することができます。
import pickle
def dumpPickle(fileName, obj):
with open(fileName, mode="wb") as f:
pickle.dump(obj, f)
dumpPickle("lst.pickle", [1,2,3,4,5])
dumpPickle("str.pickle", "helooooooo!!")
dumpPickle("int.pickle", 11114)
読み込みも同様です。
import pickle
def loadPickle(fileName):
with open(fileName, mode="rb") as f:
return pickle.load(f)
lst = loadPickle("lst.pickle")
_str = loadPickle("str.pickle")
_int = loadPickle("int.pickle")
使用には注意が必要らしい
Python の公式ドキュメントの Pickle のページトップには警告が記述されています。
警告 The pickle module is not secure. Only unpickle data you trust.
It is possible to construct malicious pickle data which will execute arbitrary code during unpickling.
Python公式ドキュメント:pickle
あんまり自信がないですが、ファイルの中身をオブジェクトに変換する過程でファイルの中身がコードだった場合、実行されちゃうよってことでしょうか。。
意図しないコードが実行されたら困るので、使い所には気を付ける必要がありそうです。