Pythonでpickleを使ってオブジェクトをシリアライズ・デシリアライズ
この記事では、Pythonのpickleモジュールを使用してオブジェクトをシリアライズ(保存)およびデシリアライズ(復元)する方法を説明します。pickleを使うことで、Pythonオブジェクトをファイルに保存したり、ネットワークを通して送信したりすることができます。
目次
pickleモジュールとは?
pickleモジュールは、Pythonオブジェクトをバイナリ形式のデータストリームに変換(シリアライズ)し、そのデータストリームからPythonオブジェクトを再構築(デシリアライズ)するためのモジュールです。これにより、Pythonオブジェクトをファイルに保存したり、ネットワークを通して送信したりすることができます。
シリアライズされたデータは、プラットフォームに依存しないとは限りません。異なるPythonバージョン間での互換性にも注意が必要です。
シリアライズ(保存)
pickle.dump()関数を使用して、オブジェクトをファイルにシリアライズします。
import pickle
data = {'name': 'Alice', 'age': 30, 'city': 'Tokyo'}
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
'wb'モードでファイルを開くことが重要です。これはバイナリ書き込みモードを表します。
デシリアライズ(復元)
pickle.load()関数を使用して、ファイルからオブジェクトをデシリアライズします。
import pickle
with open('data.pickle', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data)
'rb'モードでファイルを開く必要があります。これはバイナリ読み込みモードです。復元されたデータは元のオブジェクトと同じになります。
サポートされているオブジェクト
pickleは、多くの標準的なPythonオブジェクトをシリアライズおよびデシリアライズできます。ただし、すべてのオブジェクトがサポートされているわけではありません。サポートされていないオブジェクトをpickleしようとすると、エラーが発生します。
- 辞書、リスト、タプル、数値、文字列など多くの基本的なデータ型はサポートされています。
- カスタムクラスもpickleできますが、適切な__getstate__と__setstate__メソッドを実装する必要があります。
- 関数やメソッドなどのオブジェクトは、場合によってはpickleできない場合があります。
注意点とエラーハンドリング
pickleされたデータは、セキュリティ上のリスクを含む可能性があります。信頼できないソースからのpickleデータを読み込むことは避けてください。
import pickle
try:
with open('data.pickle', 'rb') as f:
data = pickle.load(f)
except (FileNotFoundError, EOFError, pickle.UnpicklingError) as e:
print(f"エラーが発生しました: {e}")
FileNotFoundError: ファイルが存在しない場合。 EOFError: ファイルが途中で切れている場合。 pickle.UnpicklingError: pickleデータが壊れているか、不正な場合。
サンプルコード
簡単なサンプルコードです。実行する前に、'data.pickle'というファイルが存在しないことを確認してください。
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person('Bob', 25)
with open('person.pickle', 'wb') as f:
pickle.dump(person, f)
with open('person.pickle', 'rb') as f:
loaded_person = pickle.load(f)
print(loaded_person.name, loaded_person.age)
このコードでは、Personクラスのオブジェクトをpickleし、その後デシリアライズして表示しています。
関連記事
- Pythonで辞書をJSONに変換(json.dumps)
- PythonでJSONを辞書に変換(json.loads)
- Pythonでファイルに書き込む(write, writelines)
- Pythonでファイルを読み込む(read, readline, readlines)
- Pythonでファイルを開く・閉じる(open, close)
- Pythonでファイルをバイナリモードで読み書き
- Pythonでファイルのエンコーディングを指定して読み書き
- Pythonでファイルを追記モードで開く
- Pythonでファイルの上書き・削除
- Pythonでファイル・ディレクトリの存在確認(os.path.exists, os.path.isfile, os.path.isdir)