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 專用的序列化格式,pickle 就很實用,但它不是可攜的資料交換格式。

在 Python 中使用 NumPy 函式庫的 save 函式將字典儲存至檔案

如果專案已使用 NumPy,np.save() 可以將字典儲存在 .npy 物件陣列中。載入這類物件資料時需要設定 allow_pickle=True;對載入後的零維陣列呼叫 .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}