使用pickle从文件加载已保存的字典(包含对象作为值)

时间:2018-04-02 15:58:42

标签: python load pickle

我目前正在尝试学习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)

我没有收到错误消息,但字典保持空白。 任何有关这方面的帮助将非常感激!

2 个答案:

答案 0 :(得分:1)

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

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

    return new_contacts

...

contacts = load_contacts()

如果您确实希望直接访问contacts函数中的全局load变量,可以使用global关键字告诉Python您引用{来自全球范围的{1}}:

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) 引用的对象

答案 1 :(得分:0)

尝试使用以下内容:

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