Python 3.x 在Python3.1.1中取消勾选Python2.6对象

Python 3.x 在Python3.1.1中取消勾选Python2.6对象,python-3.x,dictionary,pickle,python-2.6,Python 3.x,Dictionary,Pickle,Python 2.6,在Python2.6中,我定义了一个类Abc,制作了一个dict d,其中键是字符串,值是Abc对象。然后我把这条记录倒进了这样的文件里- pickle.dump(d,open('filename.pkl','wb')) 我可以用python 2.6成功地加载它 d1 = pickle.load(open('filename.pkl', 'rb')) (d1与d相同) 但是,当我尝试在Python3.1中加载它时,只加载了第一个键(字符串) d1 = pickle.load(open('fil

在Python2.6中,我定义了一个类Abc,制作了一个dict d,其中键是字符串,值是Abc对象。然后我把这条记录倒进了这样的文件里- pickle.dump(d,open('filename.pkl','wb'))

我可以用python 2.6成功地加载它

d1 = pickle.load(open('filename.pkl', 'rb'))
(d1与d相同)

但是,当我尝试在Python3.1中加载它时,只加载了第一个键(字符串)

d1 = pickle.load(open('filename.pkl', 'rb'))

print(d1)
keyname1
pickle文件开始时如下所示

(dp0
S'keyname1'
p1
(iabc
ABC
p2 
因此,在3.1中,它只加载文件中的第一个字符串。我对编码等方面不太了解。关于如何在3.1.1中加载我的dict d,有什么想法吗

编辑-我的类(abc.py)两次都在同一个工作目录中,不确定这是否重要

在回答后编辑-我意识到我应该澄清得更好,这样可以很容易地复制。我的代码有缺陷,既因为名称冲突,也因为我没有正确定义我的类

不管怎么说,我只是尝试了以下几点,并了解到我应该用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()
# same as before
在python-3.1中

import pickle
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
 keyname1
quit()
import pickle
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
{'keyname1': <ABC.ABC object at 0x638890>}
试试2

但是当我更改ABC.py中的类定义时,它说的是class ABC(object):而不是class ABC:,删除了旧的filename.pkl、ABC.pyc并重复

在python-2.6中

import pickle
import ABC
d = {'keyname1': ABC.ABC()}
pickle.dump(d, open('filename.pkl', 'wb'))
quit()
# same as before
在python-3.1中

import pickle
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
 keyname1
quit()
import pickle
d1 = pickle.load(open('filename.pkl', 'rb'))
print(d1)
{'keyname1': <ABC.ABC object at 0x638890>}
导入pickle
d1=pickle.load(打开('filename.pkl','rb'))
印刷品(d1)
{'keyname1':}

以下内容适用于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>}
{'keyname1':}
很明显,加载ABC对象效果很好。 我认为问题在于,您的模块
abc
与标准库中名为
abc
的模块之间存在名称冲突,并且该名称冲突在Python 2和Python 3中的行为不同


解决方案:重命名您的模块。

您好,谢谢!你的代码在没有重命名的情况下非常适合我。我认为问题在于我是在“导入”abc,而不是在3.1中重新定义它。你知道为什么我不能在2.6和3.1中简单地导入abc吗?实际上并不完美,我不确定使用的是哪种abc。我不知道标准图书馆里有一个。肯定要重命名我的模块,谢谢!!