【Python】データを保存、取得する方法(Pickle)

python-logo Python

実装していると、オブジェクトなどのデータを一時的に保存したり、それを再利用したい場合がよくある。
例えば、開発中に有料の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使っていれば便利なメソッドが用意されているのでそれを利用する
タイトルとURLをコピーしました