8.1 シリアライズとは何か
ファイルを扱い、データを保存して読み込む方法を学んだ後、次に本格的にファイルを扱う時が来ました。今日はシリアライズについて勉強を始めます。
シリアライズとは、オブジェクトをバイト列やファイルに保存したり、ネットワークを介して転送したり、データベースに保存できる形式に変換するプロセスです。デシリアライズはその逆のプロセスで、そのバイト列から元のオブジェクトを再構築します。
オブジェクトをファイルに保存する(またはネットワークで転送する)ためには、それを記録しやすい文字列(またはバイト列)に変換する必要があります。
シリアライズが使われる主な4つの方向性はこちらです:
- オブジェクトの状態の保存: プログラムの実行間でオブジェクトの状態を保存するため。
- データ転送: システム間または異なるシステム間でオブジェクトを転送するため。
- キャッシング: オブジェクトをキャッシュに保存してすばやくアクセスできるようにするため。
- データベース: 複雑なデータ構造をデータベースに保存するため。
シリアライズを扱うライブラリはたくさんあり、それぞれの要件に合わせて作られています。私たちはその中の5つを紹介しますが、そのうち2つについては詳しく学びます。
最も一般的なものを見てみましょう:
- モジュール
pickle
- モジュール
json
- モジュール
yaml
- モジュール
marshal
- モジュール
shelve
以下に各モジュールについての簡単な概要を示します:
8.2 モジュール pickle
pickle
はPythonオブジェクトのシリアライズとデシリアライズのための組み込みモジュールです。カスタムクラスを含むほとんどのPythonオブジェクトを保存して復元できます。
pickle
の使用例:
import pickle
# シリアライズするオブジェクトの例
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# オブジェクトをファイルにシリアライズ
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# ファイルからオブジェクトをデシリアライズ
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
8.3 モジュール json
json
はJSON (JavaScript Object Notation) を扱うための組み込みモジュールです。JSONはクライアントとサーバー間でデータを交換するために使用されるテキスト形式です。
json
の使用例:
import json
# シリアライズするオブジェクトの例
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# オブジェクトをJSON文字列にシリアライズ
json_string = json.dumps(data)
print(json_string)
# オブジェクトをJSONファイルにシリアライズ
with open('data.json', 'w') as file:
json.dump(data, file)
# JSON文字列からオブジェクトをデシリアライズ
loaded_data = json.loads(json_string)
print(loaded_data)
# JSONファイルからオブジェクトをデシリアライズ
with open('data.json', 'r') as file:
loaded_data = json.load(file)
print(loaded_data)
8.4 モジュール yaml
yaml
(YAML Ain't Markup Language) は人間が読みやすいデータシリアライゼーションフォーマットです。Pythonでは外部ライブラリのPyYAMLを使用してYAMLを扱います。
yaml
の使用例:
import yaml
# シリアライズするオブジェクトの例
data = {'name': 'Carol', 'age': 27, 'is_student': False}
# オブジェクトをYAML文字列にシリアライズ
yaml_string = yaml.dump(data)
print(yaml_string)
# オブジェクトをYAMLファイルにシリアライズ
with open('data.yaml', 'w') as file:
yaml.dump(data, file)
# YAML文字列からオブジェクトをデシリアライズ
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
# YAMLファイルからオブジェクトをデシリアライズ
with open('data.yaml', 'r') as file:
loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)
8.5 モジュール marshal
marshal
はPythonコードのシリアライズに使用されるPythonオブジェクトのシリアライズ用組み込みモジュールです。pickle
より高速ですが、対応するオブジェクトタイプが少なく、柔軟性がありません。
marshal
の使用例:
import marshal
# シリアライズするオブジェクトの例
data = {'name': 'Dave', 'age': 35, 'is_student': True}
# オブジェクトをファイルにシリアライズ
with open('data.marshal', 'wb') as file:
marshal.dump(data, file)
# ファイルからオブジェクトをデシリアライズ
with open('data.marshal', 'rb') as file:
loaded_data = marshal.load(file)
print(loaded_data)
8.6 モジュール shelve
shelve
は、キーに基づくストレージを使用してPythonオブジェクトをファイルに簡単に保存できる組み込みモジュールです。辞書に似ています。
shelve
の使用例:
import shelve
# シリアライズするオブジェクトの例
data = {'name': 'Eve', 'age': 28, 'is_student': False}
# オブジェクトをファイルにシリアライズ
with shelve.open('data.shelve') as db:
db['person'] = data
# ファイルからオブジェクトをデシリアライズ
with shelve.open('data.shelve') as db:
loaded_data = db['person']
print(loaded_data)
モジュールやデータ保存形式は異なりますが、それらを扱うプログラマ目線では非常に似ています。以下では、モジュール pickle
とモジュール json
をより詳しく扱います。
GO TO FULL VERSION