对于存储pickle对象的文件,使用不同文件模式的Python pickle奇怪的行为

时间:2014-07-08 12:16:56

标签: python pickle

我用以下语句腌制字典:

pickle.dump(paramsToSave, open('testvars.txt','wb'))

我正在破解以下内容:

vars = pickle.load(open('testvars.txt','rb'))

现在当我使用文件模式' w'在酸洗和' r'在unpickling,它很好。对于wb-rb,wb-r组合也是如此。

但是当我使用w-rb组合时,我收到错误:

ValueError: insecure string pickle

有人可以解释一下这种行为吗?哪个是正确的文件模式组合?

编辑:我在Windows 7上使用Python 2.6.6

1 个答案:

答案 0 :(得分:2)

首先,您应该始终使用二进制模式来处理pickle文件。在重要的平台(例如Windows)上,以文本模式打开文件意味着翻译所有行终止符; \n在写入时变为\r\n\r\n在阅读时再次变为\n

在Python 2上,默认的pickle协议是基于ASCII的,但这并不意味着值的内容不会受到影响。对于w - > rb示例,嵌入\n的值很可能写为\r\n,然后读为\r\n,表示数据的长度更改,触发错误消息,因为未满足某些引用期望(由于字符串长度已更改,因此未读取结束引号)。

您没有使用其他非二进制组合遇到此特定异常这一事实并不意味着您无论如何都没有遇到任何问题。价值观最终可能会被破坏。

所有其他协议版本都是基于二进制的,这意味着您仍可以更具创造性的方式破坏协议。