在Python中,可以通過多種方式將字典(dict)保存到文件中,并能夠隨時讀取恢復。以下是幾種常見的方法:
1. 使用 json
模塊(推薦)
適用場景:需要人類可讀的文件格式,且數據不包含Python特有對象(如自定義類)。
import json# 保存dict到文件
data = {"name": "Alice", "age": 25, "skills": ["Python", "Java"]}
with open("data.json", "w", encoding="utf-8") as f:json.dump(data, f, indent=4) # indent參數使文件更易讀# 從文件讀取dict
with open("data.json", "r", encoding="utf-8") as f:loaded_data = json.load(f)print(loaded_data) # 輸出: {'name': 'Alice', 'age': 25, 'skills': ['Python', 'Java']}
優點:
? 文件為純文本,可手動編輯。
? 跨語言兼容(幾乎所有語言都支持JSON)。
缺點:
? 無法直接保存Python特有對象(如datetime
或自定義類)。
2. 使用 pickle
模塊
適用場景:需要保存Python特有對象或復雜數據結構。
import pickle# 保存dict到文件
data = {"key": "value", "nested": {"a": 1, "b": 2}}
with open("data.pkl", "wb") as f:pickle.dump(data, f)# 從文件讀取dict
with open("data.pkl", "rb") as f:loaded_data = pickle.load(f)print(loaded_data) # 輸出原字典
優點:
? 支持幾乎所有Python對象。
? 文件為二進制格式,不易被篡改。
缺點:
? 文件不可讀,且可能存在安全風險(反序列化惡意數據)。
? 僅限Python使用。
3. 使用 yaml
模塊(需安裝 pyyaml
)
適用場景:需要更人性化的配置文件格式。
import yaml # 需安裝: pip install pyyaml# 保存dict到文件
data = {"name": "Bob", "languages": ["Python", "C++"]}
with open("data.yaml", "w", encoding="utf-8") as f:yaml.safe_dump(data, f)# 從文件讀取dict
with open("data.yaml", "r", encoding="utf-8") as f:loaded_data = yaml.safe_load(f)print(loaded_data)
優點:
? 文件可讀性極強,支持注釋。
? 適合配置文件。
缺點:
? 需要安裝第三方庫(pyyaml
)。
? 性能不如JSON或pickle。
4. 使用 shelve
模塊
適用場景:需要類似字典的持久化存儲,支持動態讀寫。
import shelve# 保存dict到文件
with shelve.open("shelve_data") as db:db["user"] = {"id": 1, "name": "Charlie"}# 從文件讀取dict
with shelve.open("shelve_data") as db:loaded_data = db["user"]print(loaded_data) # 輸出: {'id': 1, 'name': 'Charlie'}
優點:
? 像操作字典一樣讀寫數據。
? 支持動態增刪鍵值。
缺點:
? 文件為數據庫格式,不可直接編輯。
? 跨平臺兼容性可能受限。
5. 使用 csv
模塊(僅限簡單字典)
適用場景:字典結構簡單(扁平化鍵值對),需與表格軟件兼容。
import csv# 保存dict到文件
data = {"name": "David", "age": 30}
with open("data.csv", "w", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(data.keys()) # 寫入表頭writer.writerow(data.values()) # 寫入值# 讀取csv為dict
with open("data.csv", "r", encoding="utf-8") as f:reader = csv.reader(f)headers = next(reader)values = next(reader)loaded_data = dict(zip(headers, values))print(loaded_data) # 輸出: {'name': 'David', 'age': '30'}
缺點:
? 僅適合單層字典,嵌套結構需額外處理。
總結建議
? 通用性/可讀性:用 json
(首選)。
? Python特有對象:用 pickle
。
? 配置文件:用 yaml
。
? 動態鍵值存儲:用 shelve
。
? 表格兼容:用 csv
。