我试图通过使用:
来挑选患者对象theFile = open(str(location)+str(filename)+'.pkl','wb')
pickle.dump(self,theFile)
theFile.close()
这很有效并且可以根据需要成功写入文件。但!当我尝试从拇指加载数据时,我得到一个EOF错误XOR它加载了拇指中不存在的旧数据。考虑到pickle包含所有正确保存的数据,我不知道这些旧数据来自何处...
加载操作:
theFile = open('/media/SUPER/hr4e/thumb/patient.pkl','r+')
self = pickle.load(theFile)
theFile.close()
一个例子是:我更改了所需对象的属性并保存。该属性明确保存在pickle文件中,但是当我在另一台计算机上重新加载pickle文件时,它不会读取pickle并加载旧数据。我查看是否正在阅读泡菜,它是......
我遗漏的泡菜是否有微妙的细微差别?或者,我只是使用错误的读写参数来保存和加载pickle?
答案 0 :(得分:1)
在方法中分配给self只会更新变量self
在该方法中指向的内容;它不会更新对象本身。要加载它,而是从classmethod或函数返回一个新加载的对象。尝试这样的代码:
import pickle
class Patient(object):
def __init__(self, name):
self.name = name
def save(self, location, filename):
theFile = open(str(location)+str(filename)+'.pkl','wb')
pickle.dump(self,theFile)
theFile.close()
@classmethod
def load(cls, location, filename):
theFile = open(str(location)+str(filename)+'.pkl','rb')
m = pickle.load(theFile)
theFile.close()
return m
p = Patient("Bob")
print p.name
# save the patient
p.save("c:\\temp\\", "bob")
# load the patient - this could be in a new session
l = Patient.load("c:\\temp\\", "bob")
print l.name
答案 1 :(得分:0)
以二进制模式打开文件。例如 theFile = open('/ media / SUPER / hr4e / thumb / patient.pkl','r + b')
答案 2 :(得分:0)
我最终挑选了对象的属性字典。那效果好多了。例如:
self.__dict__ = pickle.load(file('data/pickles/clinic.pkl','r+b'))