Pickle
gpt-5.icon
Python の pickle は、Python オブジェクトを **バイト列に変換(シリアライズ)**したり、逆にバイト列から **オブジェクトに復元(デシリアライズ)**したりするための標準ライブラリです。主に「オブジェクトをファイルに保存する」「プロセス間でオブジェクトをやりとりする」といった用途で使われます。
基本概念
シリアライズ (serialize)
オブジェクトをバイト列に変換すること。
例: {"a": 1, "b": [2, 3]} → バイト列
デシリアライズ (deserialize)
バイト列をオブジェクトに戻すこと。
例: バイト列 → {"a": 1, "b": [2, 3]}
Pickle が便利なのは、Python の 辞書・リスト・タプル・クラスインスタンスなど、複雑なオブジェクトもそのまま保存できる点です。
基本的な使い方
code:python
import pickle
# 保存したいオブジェクト
data = {"name": "Alice", "age": 25, "scores": 90, 85, 88}
# --- シリアライズしてファイルに保存 ---
with open("data.pkl", "wb") as f: # "wb" はバイナリ書き込み
pickle.dump(data, f)
# --- ファイルから読み込み(デシリアライズ) ---
with open("data.pkl", "rb") as f: # "rb" はバイナリ読み込み
loaded_data = pickle.load(f)
print(loaded_data) # {'name': 'Alice', 'age': 25, 'scores': 90, 85, 88}
また、ファイルを介さず直接バイト列として扱うことも可能です。
code:python
b = pickle.dumps(data) # オブジェクト → バイト列
obj = pickle.loads(b) # バイト列 → オブジェクト
注意点
1. Python専用
Pickle で保存したデータは Python 以外の言語では扱えません。他言語とやりとりする場合は JSON や Protobuf などを使う方が良いです。
2. セキュリティリスク
pickle.load() は、任意の Python オブジェクトを生成できるため、信頼できないデータをロードすると危険です(悪意のあるコードが実行される可能性がある)。
→ 不特定の入力を扱う場合は JSON を推奨。
3. 互換性
Python のバージョンやオブジェクトの定義が変わると、古い pickle ファイルが読み込めなくなることがあります。
pickle の代替候補
JSON: 他言語でも読み書き可能。文字列/数値/リスト/辞書などシンプルなデータ向け。
marshal: Python バイトコード用、基本的に内部用途。
joblib: 大きな NumPy 配列や機械学習モデルを効率よく保存できる。