Pythonのデータ復元(アンピクル / unpickle)とは
Pythonでは、オブジェクトをファイルに保存したり、あとで復元したりするために pickle モジュールを使うことがあります。
保存する処理を pickle化、復元する処理を unpickle(アンピクル) と呼びます。
pickle / unpickle のイメージ
import pickle
- pickle:Pythonオブジェクトをバイト列に変換する
- unpickle:バイト列からPythonオブジェクトを復元する
例えば、辞書やリスト、学習済みモデルなどを保存して、あとで再利用できます。
データをpickle化して保存する
import pickle
data = {
"name": "Taro",
"age": 25,
"skills": ["Python", "FastAPI", "AWS"]
}
with open("data.pkl", "wb") as f:
pickle.dump(data, f)
ポイントは、ファイルを "wb" で開くことです。
wb は write binary の意味で、バイナリ形式で書き込みます。
unpickleして復元する
import pickle
with open("data.pkl", "rb") as f:
data = pickle.load(f)
print(data)
実行結果:
{'name': 'Taro', 'age': 25, 'skills': ['Python', 'FastAPI', 'AWS']}
rb は read binary の意味です。
pickleで保存したファイルはバイナリデータなので、読み込み時も rb を使います。
よくあるエラー
1. テキストモードで開いてしまう
with open("data.pkl", "r") as f:
data = pickle.load(f)
このように "r" で開くとエラーになることがあります。
正しくは以下です。
with open("data.pkl", "rb") as f:
data = pickle.load(f)
2. ファイルが存在しない
FileNotFoundError: [Errno 2] No such file or directory
この場合は、ファイルパスが正しいか確認します。
import os
print(os.getcwd())
print(os.path.exists("data.pkl"))
3. pickleではないファイルを読み込んでいる
pickle形式ではないファイルを pickle.load() すると、以下のようなエラーが出ることがあります。
_pickle.UnpicklingError: invalid load key
この場合は、読み込もうとしているファイルが本当にpickleで保存されたものか確認します。
セキュリティ上の注意
pickle.load() は便利ですが、信頼できないファイルを読み込んではいけません。
pickleファイルには任意のPython処理を含められる可能性があるため、悪意あるファイルを読み込むと危険です。
# 信頼できないpickleファイルは読み込まない
with open("unknown.pkl", "rb") as f:
data = pickle.load(f)
外部から受け取ったデータを扱う場合は、JSONなど別の形式を検討した方が安全です。
JSONとの違い
| 形式 | 特徴 |
|---|---|
| pickle | Pythonオブジェクトをそのまま保存しやすい |
| JSON | 他言語でも扱いやすく、安全性が高い |
| pickle | Python専用に近い |
| JSON | テキスト形式で中身を確認しやすい |
単純な辞書やリストであれば、JSONの方が扱いやすい場合も多いです。
import json
data = {
"name": "Taro",
"age": 25
}
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
まとめ
Pythonのunpickleとは、pickleで保存されたデータを復元する処理です。
基本形は以下です。
import pickle
with open("data.pkl", "rb") as f:
data = pickle.load(f)
注意点として、pickleファイルは必ずバイナリモードで開きます。
また、信頼できないpickleファイルは読み込まないようにしましょう。
pickleはPython内部で使うデータ保存には便利ですが、外部データ交換にはJSONなどを使う方が安全です。