0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonのデータ復元(アンピクル / unpickle)とは

0
Posted at

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" で開くことです。

wbwrite 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']}

rbread 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などを使う方が安全です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?