【问题标题】:Loading a saved dictionary (containing objects as values) from a file using pickle使用pickle从文件中加载保存的字典(包含对象作为值)
【发布时间】:2018-04-02 15:58:42
【问题描述】:

我目前正在尝试学习 Python,并且在学习了基础知识后,我决定尝试制作一个地址簿程序。保存后我无法加载联系人。这是我到目前为止所拥有的,

import pickle

contacts = {}

class Contact:
    def __init__(self, name, phone, address):
        self.name = name
        self.phone = phone
        self.address = address

Name = input('Contacts Name - ')
Phone = input('Phone Number - ')
Address = input('Address - ')

contacts[Name] = Contact(Name, Phone, Address)

with open('SaveFile', 'wb') as f:
    pickle.dump(contacts, f)

这一切似乎工作正常,并且联系人字典已保存,但是当我在清除字典后尝试重新加载联系人时,由于某种原因它不起作用,

def load():
    with open('SaveFile', 'rb') as f:
        contacts = pickle.load(f)

我没有收到错误消息,但字典仍为空。 对此的任何帮助将不胜感激!

【问题讨论】:

  • 可能是您的 load() 函数中缺少“返回联系人”吗?

标签: python load pickle


【解决方案1】:

变量有范围。您在load 函数中分配给的contacts 变量与您定义为全局变量的contacts 没有关系。最简单的解决方案是让你的函数return 成为新加载的联系人,让你替换现有的字典:

def load_contacts():
    with open('SaveFile', 'rb') as f:
        new_contacts = pickle.load(f)

    return new_contacts

...

contacts = load_contacts()

如果您确实想从load 函数中直接访问全局contacts 变量,您可以使用global 关键字告诉Python 您指的是全局范围内的contacts

def load():
    global contacts

    with open('SaveFile', 'rb') as f:
        contacts = pickle.load(f)

你也可以避免分配给你的全局contacts,而是修改它:

def load():
    contacts.clear()

    with open('SaveFile', 'rb') as f:
        new_contacts = pickle.load(f)

    contacts.update(new_contacts)

最后一个示例的不同之处在于您直接使用contacts 引用的对象

【讨论】:

    【解决方案2】:

    尝试使用以下方法:

    pickle.load(open("SaveFile", 'rb')) 
    

    【讨论】:

    • 实际上,打开文件的“正确”(引号)方式是使用 WITH 语句。它更安全。
    • 感谢您的信息,不知道这一点。
    猜你喜欢
    • 2017-05-14
    • 2012-04-04
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2012-06-28
    • 2013-02-27
    相关资源
    最近更新 更多