Python pickle存储字典追加键值对覆盖旧数据问题修复
问题根因
原add2db.py存在两个逻辑问题导致历史数据被覆盖:
- 每次脚本启动都直接初始化空字典
passDB = {},没有加载之前已经存储的历史数据 - 写入文件时使用
wb(覆盖写)模式,仅包含单条新数据的字典会直接替换掉整个旧的存储文件
修改方案
调整add2db.py执行逻辑:脚本启动时优先读取已存在的密码库文件,仅当首次运行无存储文件时才初始化空字典,新增账号密码条目后再将完整字典写回文件,即可保留所有历史存储数据。
修改后可直接使用的add2db.py代码
import pickle import os DB_FILE = "passDB.p" # 加载历史存储数据 if os.path.exists(DB_FILE): with open(DB_FILE, "rb") as f: passDB = pickle.load(f) else: passDB = {} # 录入新条目,邮箱统一转小写匹配查询逻辑 email = input("Email: ").lower() pwd = input("Password: ") passDB[email] = pwd # 写回更新后的完整数据库 with open(DB_FILE, "wb") as f: pickle.dump(passDB, f)
可选优化
原有passman.py的查询逻辑可以正常工作,仅建议把文件读写改为with上下文管理器写法,自动处理文件关闭,避免资源泄漏,优化后代码如下:
import pickle DB_FILE = "passDB.p" with open(DB_FILE, "rb") as f: passDB = pickle.load(f) query = input("Search your email account to get password: ").lower() print(passDB.get(query, "Nothing such email in database"))
内容的提问来源于stack exchange,提问作者Sayem Billah
相关产品推荐
相关产品推荐

