【问题标题】:Multiple objects in pickle file泡菜文件中的多个对象
【发布时间】:2014-08-10 08:26:13
【问题描述】:

我希望能够将多个对象添加到 pickle 文件并能够稍后检索它。我到了可以保存对象的地步,但是当我加载文件时,只加载了最后一个条目。我的错误是什么?

import pickle

class People():
    def __init__(self, name, surname, age, mobile_no, home_no):
        self.name = name
        self.surname = surname
        self.age = age
        self.mobile_no = mobile_no
        self.home_no = home_no

    def DisplayContacts(self):
        print("First Name: \t", self.name)
        print("Surname: \t", self.surname)
        print("Age: \t", self.age)
        print("Mobile Number: \t", self.mobile_no)
        print("Home Number: \t", self.home_no)
        print()


def addContact():
    newname = str(input("First name: \t"))
    newsurname = str(input("Surname: \t"))
    newage = int(input("Age: \t"))
    newmobile_no = int(input("Mobile Number: \t"))
    newhome_no = int(input("Home Number: \t"))
    newContact = People(newname, newsurname, newage, newmobile_no, newhome_no) 
    return newContact

cont = 1

contacts = []


while cont == 1:
    user = input("Do you want to add contact? (Y/N)")
    if user == "Y" or user == "y":
        print ("works")
        contacts.append(addContact())
        file = open("List.pickle", "wb")
        pickle.dump(contacts, file, pickle.HIGHEST_PROTOCOL)
        file.close()
    else:
        print ("111")
        cont = 0

useropen = input("open file? (Y/N)")
if useropen == "Y" or useropen == "y":
    with open ("List.pickle", "rb") as pickled_file:
        contacts = pickle.load(pickled_file)
else:
    print("Null")

现在,当我尝试加载文件时,它似乎是空的:

import pickle

class People():
    def __init__(self, name, surname, age, mobile_no, home_no):
        self.name = name
        self.surname = surname
        self.age = age
        self.mobile_no = mobile_no
        self.home_no = home_no

    def DisplayContacts(self):
        print("First Name: \t", self.name)
        print("Surname: \t", self.surname)
        print("Age: \t", self.age)
        print("Mobile Number: \t", self.mobile_no)
        print("Home Number: \t", self.home_no)
        print()


def addContact():
    newname = str(input("First name: \t"))
    newsurname = str(input("Surname: \t"))
    newage = int(input("Age: \t"))
    newmobile_no = int(input("Mobile Number: \t"))
    newhome_no = int(input("Home Number: \t"))
    newContact = People(newname, newsurname, newage, newmobile_no, newhome_no) 
    return newContact

cont = 1

contacts = []


while cont == 1:
    user = input("Do you want to add contact? (Y/N)")
    if user == "Y" or user == "y":
        print ("works")
        contacts.append(addContact())
        file = open("CList.pickle", "ab")
        pickle.dump(contacts, file, pickle.HIGHEST_PROTOCOL)
        file.close()
    else:
        print ("111")
        cont = 0

useropen = input("open file? (Y/N)")
if useropen == "Y" or useropen == "y":

    with open ("CList.pickle", "rb") as pickled_file:
        contacts = pickle.load(pickled_file)
else:
    print("Null")

【问题讨论】:

    标签: python pickle


    【解决方案1】:

    您正在使用模式wb 打开泡菜文件,该模式会截断(在写入任何新内容之前将文件设置回空)。您想要的模式是a,它会打开以进行追加。

    【讨论】:

    • 我已将“wb”更改为“ab”,现在什么都没有加载,会是什么?
    【解决方案2】:

    在 while 循环的每次迭代中,您都在截断 Pickle 文件,因为您是在 "wb" 模式下打开它。

    由于您在循环期间不断将联系人添加到 contacts 列表(然后在每次迭代中转储此列表的单独副本并添加一个联系人 - 可能不是您想要的),我会简单地接受整个pickle 转储部分代码并将其移动到 while 循环之后,一次转储完整的联系人列表 - 不需要多个对象。

    【讨论】:

      【解决方案3】:

      除了@Ethan Furman 所说的,'b' 在 windows 和 unix (reference) 中的功能似乎有所不同。您的代码可能在 unix 上运行良好,但在 windows 操作系统上会截断

      【讨论】:

        猜你喜欢
        • 2014-01-10
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多