从 Python 2 加载 Python 3 pickle

Nov*_*vak 5 pickle python-2.7 python-3.x

我有一个在 python 2 中创建的泡菜文件(我不知道具体是如何创建的)。它打算由以下 python 2 行加载,在 python 3 中使用时(不出所料)不起作用:

with open('filename','r') as f:
    foo, bar = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

结果:

“ascii”编解码器无法解码位置 1219 中的字节 0xc2:序号不在范围内 (128)

手动检查文件表明它是 utf-8 编码的,因此:

with open('filename','r', encoding='utf-8') as f:
    foo, bar = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

结果:

类型错误:需要类似字节的对象,而不是“str”

使用二进制编码:

with open('filename','rb', encoding='utf-8') as f:
    foo, bar = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

结果:

ValueError:二进制模式不采用编码参数

没有二进制编码:

with open('filename','rb') as f:
    foo, bar = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

结果:

UnpicklingError: 无效的加载键,“ ”。

这个泡菜文件是不是刚刚坏了?如果没有,我怎样才能在 python 3 中撬开这个东西?(我已经浏览了大量相关问题,但还没有找到任何有用的东西。)

最后,请注意原始

导入 cPickle 作为泡菜

已被替换为

导入 _pickle 作为泡菜

Nov*_*vak 2

两个错误互相混淆了。

第一:当 .p 文件到达我手中时,几乎可以肯定它在传输过程中已被损坏,可能是通过 ASCII 模式(而不是二进制模式)进行 FTP(或类似)操作。我得到了一份正确传输的副本,这让我发现......

第二:无论文件内部暗示什么,正确的编码是“latin1”而不是“utf-8”。

所以从某种意义上说,是的,文件破坏了,即使在那之后我也做错了。我将其留在这里是为了提醒那些最终遇到下一个奇怪的 pickle/python2/python3 问题的人,可能会出现多个问题,并且必须以正确的顺序解决它们。