在python 2.6中,我定义了一个类Abc,创建了一个dict d,其中键是字符串,值是abc对象。然后我将这个字典倾倒到这样的文件中 - pickle.dump(d,open('filename.pkl','wb'))
我可以使用
成功加载python 2.6d1 = 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)两次都在同一个工作目录中,不确定这是否重要?
回答后编辑 - 我意识到我应该更好地澄清,以便可以轻松复制。我的代码因为名称冲突而错误,因为我没有正确定义我的类。
无论如何,我只是尝试了以下内容并了解到我应该使用ABC类(对象)启动类:而不仅仅是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类(对象):而不仅仅是类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>}
答案 0 :(得分:0)
以下适用于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
的模块之间存在名称冲突,并且此名称冲突在Python 2和Python 3中的行为方式不同。
解决方案:重命名模块。