2

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

该文件被打开以写入'w'(不是'wb'),但cPickle被告知使用protocol = 1(所以二进制)。

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

我知道(现在)该文件应该在 Windows 中显式打开为“wb”,因为行尾。也就是说,写入的对象是一个嵌套列表并且不包含 \n 所以我不确定这是否重要。

我的问题是可以做些什么来恢复数据?

这是结果print repr(open(fqfn, 'rb').read(15))

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

任何想法表示赞赏。


我按照mhawkel = cPickle.load(open(fqfn, 'r'))的建议进行了尝试,但 Windows 向我发送了 EOF 错误。

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

序列化的输入类似于:

[['start', 3454654], [1234567645, -1 , 99], [1234567900, 1 , 56], ...]

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

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

4

1 回答 1

0

我想您可能已经尝试通过在 Windows 机器上以文本模式'r'(即不是)打开文件来解开文件。'rb'如果你很幸运,以下应该可以工作:

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

您的数据可能不包含新行,但可能包含诸如 10 或 13 之类的值。请考虑以下情况:

>>> cPickle.dumps(10, protocol=1)
'K\n.'
>>> cPickle.dumps(256, protocol=1)
'M\x00\x01.'
>>> cPickle.dumps(266, protocol=1)
'M\n\x01.'

第一个中的 '\n' 在那里,因为 ascii 10 是换行符,并且二进制泡菜模式以这种方式存储它。同样,如果您腌制 266 (256+10),您也会在输出中看到 '\n'。

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

于 2012-08-15T02:42:21.480 回答