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 文件:反序列化可能会执行代码。如果可以接受使用 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}