ValueError:不安全的字符串pickle

49 投票
10 回答
51182 浏览
提问于 2025-04-15 16:05

当我尝试加载我用cPickle保存的数据时,出现了错误信息:

ValueError: insecure string pickle

我在同一台电脑上进行保存和加载操作,操作系统都是一样的:Ubuntu 8.04。

我该如何解决这个问题呢?

10 个回答

9

查看一下这个讨论。彼得·奥滕说:

这是一个损坏的pickle文件。如果在保存的数据中,有字符串没有同时以"或'开头和结尾,就会出现这个错误。

他还展示了一种简单的方法来重现这种“损坏”。在后续的帖子中,史蒂夫·霍尔登建议,另一个导致这个问题的方法是使用不匹配的'rb'和'wb'(不过在Python 2和Linux上,这个错误通常不会被注意到)。

13

我在使用Python 2.7时遇到了一个错误,原因是打开文件的模式是'rb':

    with open(path_to_file, 'rb') as pickle_file:
        obj = pickle.load(pickle_file)

所以,在Python 2中,打开文件的模式应该是'r'

另外,我还想说的是,Python 3不支持Python 2的pickle格式。如果你尝试加载一个在Python 2中创建的pickle文件,你会得到:

pickle.unpicklingerror: the string opcode argument must be quoted
87

“在全球每天使用数十亿次的功能中,出现一个从未被观察到的Python自身的bug的可能性要小得多”:我总是对这些论坛里人们的情绪感到惊讶。

一个很简单的问题就是,忘记关闭你用来保存数据结构的流。我刚刚就犯了这个错误。

>>> out = open('xxx.dmp', 'w')
>>> cPickle.dump(d, out)
>>> k = cPickle.load(open('xxx.dmp', 'r'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: insecure string pickle

这就是我最开始来这里的原因,因为我看不出自己哪里做错了。
然后我其实想了一下,而不是直接来这里,意识到我应该这样做:

>>> out = open('xxx.dmp', 'w')
>>> cPickle.dump(d, out)
>>> out.close() # close it to make sure it's all been written
>>> k = cPickle.load(open('xxx.dmp', 'r'))

这很容易被忘记。没必要让人觉得自己是傻瓜。

撰写回答