🐍

Pickleの使い方と活用方法

に公開

Pickleとは?

PickleとはPythonの標準ライブラリで、Pythonオブジェクトをバイナリに変換したり、
バイナリからPythonオブジェクトに戻すことができるライブラリです。
バイナリファイル(.pkl)として出力も可能。
https://docs.python.org/ja/3/library/pickle.html

基本的な機能

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