PYTHON MEBY

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し、その後デシリアライズして表示しています。

関連記事