我有一个用户定义的班级' myclass'我用pickle
模块存储在文件中,但是我有问题解开它。我有大约20个相同结构的不同实例,我保存在不同的文件中。当我读取每个文件时,当我收到错误时,代码可以处理某些文件,而不会处理其他文件:
'module' object has no attribute 'myclass'
我今天生成了一些文件,昨天生成了一些其他文件,我的代码只适用于今天生成的文件(我昨天和今天之间没有更改类定义)。
我想知道我的方法是不是很健壮,如果我不做我应该做的事情,例如也许我不能腌制用户定义的类,如果这在这个过程中引入了一些随机性。
另一个问题可能是我昨天生成的文件是在另一台机器上生成的 - 因为我在一个学术集群上工作,我有一些登录节点和一些计算节点,这些节点因架构而异。所以我在计算节点上生成昨天的文件,今天在登录节点上生成文件,我正在读取登录节点上的所有内容。
根据部分评论中的建议,我已安装dill
并将其加载import dill as pickle
。现在我可以从计算节点读取文件到同一群集的登录节点。但是,如果我尝试读取在一个集群的计算节点上生成的文件,则在另一个集群的登录节点上我不能。我在dill.py
KeyError: 'ClassType'
是不是因为python版本不同?我用python2.7生成了文件,然后用python3.3读取它们。
编辑:
如果我在任何地方使用python 2.7,我都可以读取pickle文件。遗憾的是,用python 3编写的部分代码与python 2.7并不自动兼容:(
答案 0 :(得分:1)
你能from mymodule import myclass
吗?酸洗不会腌制这个类,只是对它的引用。要加载pickle对象,python必须能够找到用于创建对象的类。
例如
import pickle
class A(object):
pass
obj = A()
pickled = pickle.dumps(obj)
_A = A; del A # hide class
try:
pickle.loads(pickled)
except AttributeError as e:
print(e)
A = _A # unhide class
print(pickle.loads(pickled))