首页 > 解决方案 > 如何将 python 类的所有信息保存为二进制文件?

问题描述

我正在创建一个小 shell 应用程序来帮助我保存一些信息并查看一些 python。

我有一些 python 代码用于一堆相互引用的类,例如 User、Person、Contact、Event,然后是我用来测试它的主 App.py。

我正在使用 pickle 来保存数据,以这个问题为灵感。

我的问题是虽然课程被保存了,但“内部信息没有”。

import Event
import Contact
import pickle
def saveObj(filename, obj):
    with open(filename, 'wb') as output:
    pickle.dump(obj,output, pickle.HIGHEST_PROTOCOL)
    print("SAVED")

def loadObj(filename, obj):
    with open(filename, 'rb') as input:
    obj = pickle.load(input)
    print("LOADED")

p1 = Person.Person("abcd",12,"ui")
p2 = Person.Person("Hah",123,"aaa")
c1 = Contact.Contact([p1,p2], "Wakanda", "12-23-54")
e1 = Event.Event([p1],"12-32-31")
e1.setTitle();
e1.setDescription();

c2 = Contact.Contact([p2],"Forever", "12-23-53")


print("1 for new user, 2 for existing user")
ipt = input("Write something but not exit!\n>>")
filename = ""
while (ipt!= "exit!"):
    if (ipt=="1"):
        print("1")
        idNumber = input("Insert id\n>> ")
        name = input("Inser name\n>> ")
        filename = str(idNumber)+".data"
        session = LoggedIn.User(idNumber,name)
        session.addStuff([e1],[c1,c2],[p1,p2])
        print(session.people)
        saveObj(filename,session)
        del session
    elif(ipt=="2"):
        print("2")
        session = LoggedIn.User(None,None)    
        loadObj(filename,session)
        print(session.people)
    ipt = input("Write something but not exit!\n>>")

我想要的回报将等于我使用 option 1和 option 2时的回报。但相反,它是这样的:

1 for new user, 2 for existing user
Write something but not exit!
>>1
1
Insert id
>> 12345678
Inser name
>> AAA
[<Person.Person object at 0x7fa8079c6908>, <Person.Person object at 0x7fa8079c6940>]
SAVED
Write something but not exit!
>>2
2
LOADED
[]
Write something but not exit!
>>

我怎样才能解决这个问题?

标签: pythonpython-3.xserializationpickle

解决方案


obj = pickle.load(input)不会更改您通过obj参数传入的对象的值。尝试使用return.

def loadObj(filename):
    with open(filename, 'rb') as input:
        obj = pickle.load(input)
    print("LOADED")
    return obj

#later...

print("2")
session = loadObj(filename)
print(session.people)

推荐阅读