用Python 3取消python 2对象

我想知道是否有一种方法来加载Python 2.4中使用Python 3.4进行pickle的对象。

我一直在大量的公司遗留代码上运行2to3,以使其更新。

做到这一点,运行文件时,我得到以下错误:

File "H:\fixers - 3.4\addressfixer - 3.4\trunk\lib\address\address_generic.py" , line 382, in read_ref_files d = pickle.load(open(mshelffile, 'rb')) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128) 

在争用中查看腌制对象,这是一个dict中的dict ,包含键入和strtypes的值。

所以我的问题是:是否有一种方法来加载一个对象,最初在python 2.4,python3.4?

您必须告诉pickle.load()如何将Python字节串数据转换为Python 3string,或者您可以告诉pickle将它们保留为字节。

缺省情况下,尝试将所有string数据解码为ASCII,解码失败。 请参阅pickle.load()文档 :

可选的关键字参数是fix_imports编码错误 ,用于控制由Python 2生成的pickle stream的兼容性支持。如果fix_imports为true,pickle将尝试将旧的Python 2名称映射到Python 3中使用的新名称。 编码错误告诉pickle如何解码由Python 2腌制的8位string实例; 这些默认值分别为“ASCII”和“strict”。 编码可以是“字节”来读取这些8位string实例作为字节对象。

将编码设置为latin1可以直接导入数据:

 with open(mshelffile, 'rb') as f: d = pickle.load(f, encoding='latin1') 

但是您需要validation是否没有任何string使用错误的编码解码器进行解码; Latin-1适用于任何input,因为它将字节值0-255直接映射到前256个Unicode代码点。

另一种方法是使用encoding='bytes'加载数据,然后解码所有的bytes键和值。