python cPickle unpickle错误加载密钥无效

2024-09-30 16:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

python对象是字符串和数字的嵌套列表。在

已打开文件以“w”(而不是“wb”)写入,但cPickle被告知使用protocol=1(因此是二进制)。在

序列化和反序列化代码在Linux上运行良好。我无法恢复保存在Windows机器(python2.6)上的对象。在

我知道(现在)文件应该在Windows中显式地作为'wb'打开,因为行结束。也就是说写入的对象是一个嵌套列表,不包含\n因此我不确定这是否重要。在

我的问题是如何恢复数据?在

以下是print repr(open(fqfn, 'rb').read(15))的结果:

 ']q\x01(]q\x02]q\x03(U\x0fst'

任何想法都值得赞赏。在


我尝试将l = cPickle.load(open(fqfn, 'r'))作为suggested by mhawke,但是Windows向我发送了一个EOF错误。在

如果我直接在十六进制编辑器中打开文件,我可以简单地将'\r\n'的实例替换为10和{},然后使用二进制模式恢复吗?在

序列化的输入类似于:

^{pr2}$

我知道输入的顺序、每个列表的长度和一些值(例如开头的字符串和一些数字)。在

所以我想我的问题是我是否可以通过编写一个处理二进制编码的脚本来反序列化。我不需要把它放到python对象中——ascii就足够了。在


Tags: 文件对象字符串代码列表序列化linuxwindows
1条回答
网友
1楼 · 发布于 2024-09-30 16:31:37

我想您可能已经尝试过在Windows机器上以文本模式'r'(即不是'rb')打开它来取消文件的绑定。如果幸运的话,下面的方法应该有用:

import cPickle
l = cPickle.load(open(fqfn, 'r'))

数据可能不包含新行,但可能包含10或13等值。考虑以下因素:

^{pr2}$

第一个字符中的'\n'是因为ascii 10是新行字符,二进制pickle模式以这种方式存储它。类似地,如果pickle 266(256+10),您也将在输出中看到'\n'。在

在Windows上,当写入以“文本”模式打开的文件时,Python会自动将“\n”转换为“\r\n”。当以文本模式读取时,它还会将'\r\n'转换为'\n'。因此,在Windows机器上以“文本”模式打开文件应该可以解决您的问题。在

相关问题 更多 >