【问题标题】:How can I save all information of a python class to binary?如何将 python 类的所有信息保存为二进制文件?
【发布时间】:2019-01-11 17:56:36
【问题描述】:

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

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

我正在使用pickle来保存数据,using this question as inspiration.

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

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

当我使用选项 1 和选项 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!
>>

我该如何解决这个问题?

【问题讨论】:

  • 试试dill

标签: python python-3.x serialization pickle


【解决方案1】:

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)

【讨论】:

  • 我觉得自己很笨,不知怎的,我以为我在传递一个参考。这将作为对可能遇到相同问题的人的提醒。这不是参考! (非常感谢您的快速回复)
  • 这是一个相当普遍的问题,因为 Python 似乎不遵循许多其他语言所遵循的传递引用或传递值。实际上,它实际上非常接近于传递引用:在原始函数的开头,obj 和 session 在引用上是相同的,您可以通过打印它们的 id() 来确认.但是obj = ...赋值语句只改变了obj的值,保持会话不变。
猜你喜欢
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2014-01-16
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多