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}