Python通讯录开发问题:使用pickle加载含对象的字典失败
解决Python通讯录pickle加载失败问题
嘿,我看你在开发Python通讯录时遇到了保存后无法加载联系人的问题,而且你的代码里还有几个小细节需要调整,咱们一步步来搞定它:
原代码的核心问题
- 实例化
Contact类时多了个多余的...,这会直接导致语法错误,得删掉; - 只创建了联系人字典,但没有将数据写入文件的逻辑;
- 完全缺失从文件加载已有联系人的代码,这就是你无法加载的关键原因。
修正后的完整代码
import pickle class Contact: def __init__(self, name, phone, address): self.name = name self.phone = phone self.address = address # 加载联系人的函数 def load_contacts(): try: # 以二进制读模式打开文件 with open("contacts.pkl", "rb") as f: return pickle.load(f) except FileNotFoundError: # 如果文件不存在,返回空字典 return {} # 保存联系人的函数 def save_contacts(contacts): # 以二进制写模式打开文件 with open("contacts.pkl", "wb") as f: pickle.dump(contacts, f) # 主逻辑 contacts = load_contacts() # 添加新联系人 name = input('Contacts Name - ') phone = input('Phone Number - ') address = input('Address - ') contacts[name] = Contact(name, phone, address) # 保存到文件 save_contacts(contacts) print("联系人已保存!") # 测试加载(可以单独运行这部分查看已保存的联系人) print("\n已加载的联系人:") loaded_contacts = load_contacts() for name, contact in loaded_contacts.items(): print(f"姓名:{contact.name},电话:{contact.phone},地址:{contact.address}")
关键要点解释
- 文件操作模式:pickle必须使用二进制模式(
wb写、rb读),不能用普通文本模式,否则会报错; - 异常处理:加载时判断文件是否存在,避免第一次运行程序因没有通讯录文件而崩溃;
- 类的兼容性:pickle加载对象时,必须保证当前环境中有对应的
Contact类定义,你的代码已经满足这一点,所以没问题; - 函数封装:把加载和保存逻辑封装成函数,代码更整洁,也方便后续重复调用。
现在你可以运行代码添加联系人,关闭程序后再重新运行,就能看到之前保存的联系人被成功加载啦!
内容的提问来源于stack exchange,提问作者Gregor Arbuckle
相关产品推荐
相关产品推荐

