HOWTO · Python
Python で辞書をファイルに保存する
このチュートリアルでは、Python で辞書をファイルに保存する方法を示します。
このページの内容
Pythonの辞書を保存して後から読み込むには、データの用途に合わせて形式を選びます。移植しやすく人が読みやすいファイルにしたい場合は、JSONと互換性のある値にJSONを使います。Pythonオブジェクトを保存し、信頼できるソースのファイルだけを読み込む場合はpickleが使えます。すでにNumPyを使うワークフローなら、NumPyの.npy形式が選択肢になります。以下の各例では、ファイルに保存した辞書を読み込み直します。
Pythonでpickleモジュールのdump関数を使って辞書をファイルに保存する
pickleモジュールは、PythonオブジェクトをPython固有のバイナリ形式で保存します。次の例では、pickle.dump()で辞書を書き込み、pickle.load()で読み込みます。バイト列を書き込むときはwb、読み込むときはrbを使います。一時ディレクトリを使うため、例をその中だけで完結させられます。
import pickle
from pathlib import Path
from tempfile import TemporaryDirectory
my_dict = {"Apple": 4, "Banana": 2, "Orange": 6, "Grapes": 11}
with TemporaryDirectory() as directory:
file_path = Path(directory) / "myDictionary.pkl"
with file_path.open("wb") as file:
pickle.dump(my_dict, file)
with file_path.open("rb") as file:
new_dict = pickle.load(file)
print(new_dict)
{'Apple': 4, 'Banana': 2, 'Orange': 6, 'Grapes': 11}
信頼できるソースからのpickleファイルだけを読み込んでください。pickleの読み込み処理ではコードが実行される可能性があります。Python固有のシリアライズで問題ない場合には便利ですが、異なる環境間でデータを受け渡すための移植性の高い形式ではありません。
PythonでNumPyライブラリのsave関数を使って辞書をファイルに保存する
プロジェクトですでにNumPyを使っている場合、np.save()で辞書を.npy形式のオブジェクト配列として保存できます。このオブジェクトデータを読み込むにはallow_pickle=Trueが必要です。読み込まれた0次元配列に.item()を呼び出すと、辞書を取り出せます。この方法にも、pickle化されたデータを読み込む際の信頼上のリスクがあります。また、NumPyをインストールしておく必要があります。
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory
my_dict = {"Apple": 4, "Banana": 2, "Orange": 6, "Grapes": 11}
with TemporaryDirectory() as directory:
file_path = Path(directory) / "dictionary.npy"
np.save(file_path, my_dict)
new_dict = np.load(file_path, allow_pickle=True).item()
print(new_dict)
{'Apple': 4, 'Banana': 2, 'Orange': 6, 'Grapes': 11}
Pythonでjsonモジュールのdump関数を使って辞書をファイルに保存する
人が読みやすく、ほかの言語との間でも受け渡せるファイルにするには、辞書にJSON互換の値が含まれている場合にPython標準のjsonモジュールを使います。json.dump()はテキストファイルに書き込み、json.load()はそこから読み込みます。コンテキストマネージャーを使うと、処理が失敗した場合もファイルが閉じられます。JSONは任意のPythonオブジェクトや、Pythonのすべての型をそのまま保持できるわけではありません。たとえば、独自クラスを扱うには明示的な変換方法が必要です。
import json
from pathlib import Path
from tempfile import TemporaryDirectory
my_dict = {"Apple": 4, "Banana": 2, "Orange": 6, "Grapes": 11}
with TemporaryDirectory() as directory:
file_path = Path(directory) / "myDictionary.json"
with file_path.open("w", encoding="utf-8") as file:
json.dump(my_dict, file)
with file_path.open("r", encoding="utf-8") as file:
new_dict = json.load(file)
print(new_dict)
{'Apple': 4, 'Banana': 2, 'Orange': 6, 'Grapes': 11}