lisz-works

技術と興味の集合体

超簡単!Python3のPickleで変数・クラスをまるごと保存

【スポンサーリンク】

Python

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から取得→解析する」とすることで、その辺を考えないで済むようになりますよね!

初期設定/途中データの保存

  1. 初期処理で重たい計算を行っている
  2. 途中経過を保存したい

なんてときに使えそうですね。

ぼくはチョチョイとしたプログラムしか組んでないので、あまりこういうことはないですが……

「計算が固定なのに、毎回行わせるには処理的には重たい」

なんて場合はイイかもしれません。

ゲームのセーブデータ

クラスまるごとバイナリデータ化できるってことは、ゲームのセーブデータに使えるかもしれませんね。

RPGなど「現在の状況」を保存するためには要素が大量……

というときに使えるかもしれません。
バイナリデータなので、「普通のユーザ」には中身が見えないですからね。

改ざんの可能性を考えると、「対象クラスを暗号化する」とか必要かもしれませんが……

エラーレポート

クラッシュ時にPickleがもし取れるなら、「それを貰ってエラーレポートにする」なんてこともできるかもしれませんね。

なにか躓いたときの状況を保存して、渡せばそのまま再現できちゃう。

となると、デバッグ側はかなり楽な気がします。

あとがき

「Pickleを使うと現在の変数の状況が保存できる!」

ということを覚えておくと、何かに使えるかもしれません。

「これ保存できたら楽じゃね!?」

と思いついたら是非使ってみましょう!