如何正确将Python字典写入文本文件并读取为字典类型
问题原因
- 打开文件用了
a+追加模式,每次运行都会把当前字典转成字符串直接拼到文件末尾,多次运行自然会出现多个字典首尾相连的无效内容,根本没法解析。 - 直接用
str()把字典转成字符串写入,本身就不是标准的结构化存储格式,读出来当然是字符串类型,没法直接当字典用。之前用json.dump报序列化错误,是因为你传入的参数是未调用的方法对象(比如漏写括号的mydic.keys、mydic.items),不是普通字典本身,只要传对参数就不会有这个问题。
正确实现方法
优先用JSON做序列化,跨语言兼容、安全性高,是这类场景的标准方案:
- 程序启动时先判断存储文件是否存在,存在就读取已有内容反序列化为字典,不存在就初始化空字典
- 新录入的内容直接更新到这个已加载的字典里
- 写入的时候用
w覆盖模式,把完整字典通过json.dump序列化后写入,不要用追加模式 - 读取的时候直接用
json.load就能拿到原生字典类型,不需要手动做类型转换
对应可直接运行的代码:
import json import os FILE_PATH = "cd.txt" # 存成txt或者json后缀都可以 # 加载已有数据 if os.path.exists(FILE_PATH): with open(FILE_PATH, "r", encoding="utf-8") as f: # 处理文件为空/损坏的边界情况 try: user_dict = json.load(f) except json.JSONDecodeError: user_dict = {} else: user_dict = {} # 录入新数据 for _ in range(3): uname = input("enter uname:\n") pwd = input("enter pwd:\n") user_dict[uname] = pwd print(f"合并后完整字典:{user_dict}") # 全量覆盖写入 with open(FILE_PATH, "w", encoding="utf-8") as f: json.dump(user_dict, f, ensure_ascii=False, indent=4) # 读取验证 with open(FILE_PATH, "r", encoding="utf-8") as f: loaded_data = json.load(f) print(f"读取结果:{loaded_data},数据类型:{type(loaded_data)}")
补充说明:如果非要存字典的字符串形式,绝对不要用内置
eval()做转换,会有执行任意恶意代码的风险,可使用ast.literal_eval()做安全转换,但这种方式兼容性、通用性都远不如JSON,不推荐使用。
多次运行程序后,文件内只会存储单个合法的JSON结构,不会再出现字典拼接的问题,读取后直接可以当字典使用,不会出现字符串类型的问题。
内容的提问来源于stack exchange,提问作者user19398338
相关产品推荐
相关产品推荐

