用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
,包含键入和str
types的值。
所以我的问题是:是否有一种方法来加载一个对象,最初在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
键和值。