🐍
Pickleの使い方と活用方法
Pickleとは?
PickleとはPythonの標準ライブラリで、Pythonオブジェクトをバイナリに変換したり、
バイナリからPythonオブジェクトに戻すことができるライブラリです。
バイナリファイル(.pkl)として出力も可能。
基本的な機能
pickle.dumps(obj)
: Pythonオブジェクト -> バイナリ
pickle.dump(f, obj)
: Pythonオブジェクト -> バイナリファイル
pickle.loads(bin_data)
: バイナリ -> Pythonオブジェクト
pickle.load(f)
: バイナリファイル -> Pythonオブジェクト
json
モジュールを使ったことがある人は分かりやすいかも。
サンプルコード
import pickle
# 今回は例としてlist[str]を保存してみる
data = ['hoge', 'huga']
dumped_data = pickle.dumps(data)
print(dumped_data.hex()) # 80049513000000000000005d94288c04686f6765948c046875676194652e
loaded_data = pickle.loads(dumped_data)
print(loaded_data) # ['hoge', 'huga']
こんな感じで、Pythonオブジェクトを変換、読み込みすることができました!
しかし、list[str]のようなものは、JSONでもいいので、次はカスタムクラスをダンプしてみましょう!
カスタムクラスを扱う
カスタムクラスを扱う時に注意することは、クラスを定義してからバイナリを読み込むことです。
例えば、ダンプとロードを別のPythonファイルで行い、ロード時にダンプしたクラスが定義されていない場合エラーが発生するので注意してください。
サンプル
from dataclasses import dataclass
import pickle
@dataclass
class Item:
name: str
amount: int
dumped_data = pickle.dumps(Item("hoge", 1))
print(pickle.loads(dumped_data).name) # hoge
活用例: httpでPythonオブジェクトを送信
サーバー、クライアントともにPythonを使用する必要がありますが、
クラスが扱えるので便利です。
models.py
class Dish:
name: str
price: int
server.py
from flask import Flask
from models improt Dish
import pickle
DISHES = [Dish("Hamburger", 350), Dish("French fries", 200)]
app = Flask("__app__")
@app.route("/dishes")
def dishes():
return pickle.dumps(DISHES)
if __name__ == "__main__":
app.run()
client.py
from models import Dish
import requests
DISHES = pickle.loads(requests.get("http://localhost:5000/dishes").content)
for d in DISHES:
print(d)
ポイント
- dumpsとloadsを使用してPythonオブジェクトをバイナリ化し、httpで送受信
- 共通のmodels.pyを使用してダンプ、ロードを可能にする
まとめ
Pickleを使うことで、Pythonオブジェクトをバイナリ化し、ファイルとして保存したり
httpで送受信することが可能になります!
Discussion