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

Python pickle对存储pickle对象的文件使用不同的文件模式时的奇怪行为,python,pickle,Python,Pickle,我正在整理一本有以下语句的词典: pickle.dump(paramsToSave, open('testvars.txt','wb')) 我对以下几点表示不满: vars = pickle.load(open('testvars.txt','rb')) 现在,当我在酸洗中使用文件模式“w”和在取消酸洗中使用文件模式“r”时,一切正常。wb-rb、wb-r组合也一样 但当我使用w-rb组合时,我得到一个错误: ValueError: insecure string pickle 有人能解释

我正在整理一本有以下语句的词典:

pickle.dump(paramsToSave, open('testvars.txt','wb'))
我对以下几点表示不满:

vars = pickle.load(open('testvars.txt','rb'))
现在,当我在酸洗中使用文件模式“w”和在取消酸洗中使用文件模式“r”时,一切正常。wb-rb、wb-r组合也一样

但当我使用w-rb组合时,我得到一个错误:

ValueError: insecure string pickle
有人能解释一下这种行为吗?哪一种是正确的文件模式组合

编辑:我在Windows 7上使用的是Python 2.6.6。首先,pickle文件应该始终使用二进制模式。在涉及此问题的平台(例如Windows)上,以文本模式打开文件意味着所有行终止符都被转换<代码>\n在写入时变为
\r\n
,而
\r\n
在读取时再次变为
\n

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

对于其他非二进制组合,您没有遇到此特定异常,这并不意味着您没有任何问题。值仍可能最终被损坏


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

您可能在Windows或其他平台上,使用的是标准行分隔符约定,而不是
\n
。您使用的是哪种Python版本?Python 3切换了正在使用的默认协议。