Python Pickle在读取和未正确读取时产生EOF错误

时间:2011-10-13 00:17:52

标签: python pickle

我试图通过使用:

来挑选患者对象
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?

3 个答案:

答案 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'))