You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

关键要点解释

  1. 文件操作模式:pickle必须使用二进制模式(wb写、rb读),不能用普通文本模式,否则会报错;
  2. 异常处理:加载时判断文件是否存在,避免第一次运行程序因没有通讯录文件而崩溃;
  3. 类的兼容性:pickle加载对象时,必须保证当前环境中有对应的Contact类定义,你的代码已经满足这一点,所以没问题;
  4. 函数封装:把加载和保存逻辑封装成函数,代码更整洁,也方便后续重复调用。

现在你可以运行代码添加联系人,关闭程序后再重新运行,就能看到之前保存的联系人被成功加载啦!

内容的提问来源于stack exchange,提问作者Gregor Arbuckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:39