Pickleという、Pythonの変数などを外部ファイルに保存する機能についてです。
コレを使えば、自前でフォーマットなどを考えなくても、変数やクラスをまるごと保存→取得して復元することができます!
単純なPickle
一番単純な例として、文字列データを例に出します。
ファイルにダンプ(保存)
やっていることは、ファイルを開いて、Pickleのdump()をするだけ!
import pickle with open('test.pickle', mode='wb') as f: pickle.dump('hello', f)
ファイルを読込み
保存同様、ファイルを開いて、Pickleのload()をするだけ!
import pickle with open('test.pickle', mode='rb') as f: print(pickle.load(f))
この場合は結果として
hello
と表示されます。
ダンプしたものと同じデータが取得できましたね!
変数やクラスをPickle
Pickleは変数やクラスにも利用できます。
変数でPickle
例えばこんな感じで、ディクショナリ型をダンプします。
import pickle di = { 1: 'tom', 2: 'may', 3: 'john' } with open('test.pickle', mode='wb') as f: pickle.dump(di, f)
これを読み込んで、中身を見てみます。
import pickle with open('test.pickle', mode='rb') as f: res = pickle.load(f) print(res)
するとこのように表示されます。
{1: 'tom', 2: 'may', 3: 'john'}
変数はもちろんディクショナリ型が入っています。
こうすれば
print(type(res)) print(res[2])
こう表示されます。
<class 'dict'> may
クラスをPickle
こんな感じのクラスを用意してみました。
よくある人物データですね。
# PersonData.py class Person: def __init__(self, name, age): self.name = name self.age = age def profile(self): print('name: ' + self.name) print('age : ' + str(self.age)) if __name__ == '__main__': rem = Person('rem', 17) rem.profile()
このクラスを利用して、クラスを実体化します。
そのデータを、Pickleでダンプ!
import pickle from PersonData import Person rem = Person('rem', 17) with open('test.pickle', mode='wb') as f: pickle.dump(rem, f)
さて、読み込みましょう!
import pickle from PersonData import Person with open('test.pickle', mode='rb') as f: oni = pickle.load(f) oni.profile()
ちゃんとダンプしていた人物のプロフィールが表示されましたね!
name: rem
age : 17
こんなときに使える?
活用する箇所は多々あるとは思いますが、いくつか事例を考えてみました。
Seleniumなどで取得したページデータ
Webスクレイピングをしようとすると
「あるページのデータ」
を取得して解析しますよね。
毎度取得すると、通信も発生するし、処理速度的にも通信時間が絡みます。
外で作業するケースがあった場合、如実に関係しそうですよね。
コレを「取得したデータ(クラス)をPickle」してしまえば、「Pickleから取得→解析する」とすることで、その辺を考えないで済むようになりますよね!
初期設定/途中データの保存
- 初期処理で重たい計算を行っている
- 途中経過を保存したい
なんてときに使えそうですね。
ぼくはチョチョイとしたプログラムしか組んでないので、あまりこういうことはないですが……
「計算が固定なのに、毎回行わせるには処理的には重たい」
なんて場合はイイかもしれません。
ゲームのセーブデータ
クラスまるごとバイナリデータ化できるってことは、ゲームのセーブデータに使えるかもしれませんね。
RPGなど「現在の状況」を保存するためには要素が大量……
というときに使えるかもしれません。
バイナリデータなので、「普通のユーザ」には中身が見えないですからね。
改ざんの可能性を考えると、「対象クラスを暗号化する」とか必要かもしれませんが……
エラーレポート
クラッシュ時にPickleがもし取れるなら、「それを貰ってエラーレポートにする」なんてこともできるかもしれませんね。
なにか躓いたときの状況を保存して、渡せばそのまま再現できちゃう。
となると、デバッグ側はかなり楽な気がします。
あとがき
「Pickleを使うと現在の変数の状況が保存できる!」
ということを覚えておくと、何かに使えるかもしれません。
「これ保存できたら楽じゃね!?」
と思いついたら是非使ってみましょう!