在python2.6中,我定义了一个Abc类,创建了一个dict d,其中key是字符串,值是abc对象。然后我将这个字典转储到一个文件中,如下所示- pickle.dump(d,open('filename.pkl','wb'))
我可以用以下命令成功加载python2.6
d1 = pickle.load(open('filename.pkl', 'rb'))(d1与d相同)
但是当我尝试在python 3.1中加载它时,只加载了第一个键(字符串
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
keyname1酸洗过的文件开始如下所示
(dp0
S'keyname1'
p1
(iabc
ABC
p2 因此,在3.1中,它似乎只加载文件中的第一个字符串。我对编码等不太了解。你有什么想法可以在3.1.1中加载我的dict d吗?
编辑-我的类(abc.py)两次都在同一个工作目录中,不确定这是否重要?
一次又一次的编辑-我意识到我应该更好地澄清,这样它就可以很容易地被复制。我的代码有buggy,这既是因为名称冲突,也是因为我没有正确定义我的类。
无论如何,我只是尝试了以下方法,并了解到我应该从类ABC (Object)开始:而不仅仅是类ABC。并且我应该在第二次导入模块之前删除.pyc文件。
我所做的
尝试1
ABC.py
class ABC():
pass在python-2.6中
import pickle
import ABC
d = {'keyname1': ABC.ABC()}
pickle.dump(d, open('filename.pkl', 'wb'))
quit()在python-3.1中
import pickle
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
keyname1
quit()尝试2
但当我更改了ABC.py中的类定义,使其变为类ABC(object):而不只是类ABC:,删除了旧的filename.pkl,ABC.pyc并重复,
在python-2.6中
# same as before在python-3.1中
import pickle
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
{'keyname1': <ABC.ABC object at 0x638890>}发布于 2011-06-26 14:42:06
以下代码适用于Python 2.6.6和Python 3.1.3:
Python 2.6代码:
import pickle
class ABC(object):
pass
d = {'keyname1': ABC()}
# Dump!
pickle.dump(d, open('filename.pkl', 'wb'))Python 3.1代码:
import pickle
class ABC(object):
pass
# Load:
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)结果是:
{'keyname1': <__main__.ABC object at 0x8c99eec>}因此,很明显,加载ABC对象工作得很好。我认为问题在于您的模块abc和标准库中名为abc的模块之间存在名称冲突,并且这种名称冲突在Python2和Python3中表现不同。
解决方案:重命名您的模块。
https://stackoverflow.com/questions/6481670
复制相似问题