在python 3.1.1中解开python 2.6对象

时间:2011-06-26 01:50:14

标签: python-3.x dictionary pickle python-2.6

在python 2.6中,我定义了一个类Abc,创建了一个dict d,其中键是字符串,值是abc对象。然后我将这个字典倾倒到这样的文件中 - pickle.dump(d,open('filename.pkl','wb'))

我可以使用

成功加载python 2.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)两次都在同一个工作目录中,不确定这是否重要?

回答后编辑 - 我意识到我应该更好地澄清,以便可以轻松复制。我的代码因为名称冲突而错误,因为我没有正确定义我的类。

无论如何,我只是尝试了以下内容并了解到我应该使用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>}

1 个答案:

答案 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中的行为方式不同。

解决方案:重命名模块。