実装していると、オブジェクトなどのデータを一時的に保存したり、それを再利用したい場合がよくある。
例えば、開発中に有料のAPIは何度も叩きたくないので、
一度叩いてそのデータを保存し、それを使いまわしつつデバッグしたいときなどだ。
筆者はOpenAI APIを使った開発をしているときには、一度取得した情報はローカルファイルに保存して再利用するようにしている。
この記事では、その実装方法を2通り解説する。
仕組み
どちらの方法でも、標準で組み込まれているpickle
という仕組みを利用して
データをバイナリ形式でローカルファイルに保存する形になる。https://docs.python.org/ja/3/library/pickle.html
データフォーマット
保存するデータの形式は2通り考えることができる。
- pickle:Python上のデータは全てこの形で保存できる。しかしエディタでファイルを開いて中身を見ることはできない。
- json:クラスなどはこの形で保存できない。しかしエディタで開いて中身の確認ができる。
今回保存したいデータクラス
名前と年齢をプロパティに持つUserクラスを保存、取り出しすることを想定する。
class User:
name: str
age: int
def __init__(self, name: str, age: int) -> None:
self.name = name
self.age = age
def get_name(self) -> str:
return self.name
def get_age(self) -> int:
return self.age
方法①:一番標準的な方法
結局のところ、ただのファイル入出力なのでwith文を使って保存や取得を行えばよいだけ。
保存
picle.dump()
を使って保存する。
import pickle
user = User("yamada", 20)
with open("user.pkl", "wb") as file:
pickle.dump(user, file)
取得
pickle.load()
を使って取得する
import pickle
with open("user.pkl", "rb") as file:
user = pickle.load(file)
print(f"name={user.get_name()}, age={user.get_age()}")
方法②:pandasを利用している場合
もしそのコードでpandasを利用しているならば、
pandasには便利なメソッドが実装されているためそちらを使うほうが簡単である。
with文を使わずにデータの入出力を行うことができる。
保存
pd.to_pickle()
を利用する。
import pandas as pd
user = User("yamada", 20)
print(f"name={user.get_name()}, age={user.get_age()}")
pd.to_pickle(user, "user.pkl")
取得
pd.read_pickle()
を利用する。
import pandas as pd
user = pd.read_pickle("user.pkl")
print(f"name={user.get_name()}, age={user.get_age()}")
まとめ
- データはpickle形式で保存するのが楽
- pandas使ってなければwith文で普通のファイル入出力を行う
- pandas使っていれば便利なメソッドが用意されているのでそれを利用する