当我尝试加载使用cPickle转储的东西时,我收到错误消息:
ValueError: insecure string pickle
Run Code Online (Sandbox Code Playgroud)
转储和加载工作都在同一台计算机上完成,因此操作系统相同:Ubuntu 8.04.
我怎么能解决这个问题?
小智 86
"在全世界每天使用数十亿次的功能中,比在Python本身中一个从未发现的错误更有可能":它总是让我惊讶于跨人们如何进入这些论坛.
解决此问题的一种简单方法是忘记关闭用于转储数据结构的流.我已经做了
>>> 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
Run Code Online (Sandbox Code Playgroud)
这就是为什么我首先来到这里,因为我看不出我做错了什么.
然后我真的想到了它,而不仅仅是来到这里,并意识到我应该做到:
>>> 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'))
Run Code Online (Sandbox Code Playgroud)
容易忘记.不需要人们被告知他们是白痴.
由于打开模式'rb',我在Python 2.7中遇到此错误:
with open(path_to_file, 'rb') as pickle_file:
obj = pickle.load(pickle_file)
Run Code Online (Sandbox Code Playgroud)
所以,对于Python 2'模式'应该是'r'
另外,我想知道Python 3不支持Python 2的pickle格式,如果你试图加载在Python 2中创建的pickle文件,你会得到:
pickle.unpicklingerror: the string opcode argument must be quoted
Run Code Online (Sandbox Code Playgroud)
什么是你之间的数据做dump()和load()?将pickle数据存储在以文本模式(在Windows上)或数据库存储中打开的文件中的方式是非常常见的错误,因为二进制数据无法正常工作(某些数据库中的VARCHAR,TEXT列,某些键值存储).尝试比较传递给存储并立即从中检索的pickle数据.
如果有人使用此错误youtube-dl,此问题有修复:https://github.com/rg3/youtube-dl/issues/7172#issuecomment-242961695
richiecannizzo于8月28日评论道
brew install libav
应该立即修复它在mac或
sudo apt-get install libav
#on linux
如果你的pickle很大(Python问题#11564),python 2(以及python 3的早期版本)也可能出现此错误:
Python 2.7.11 |Anaconda custom (64-bit)| (default, Dec 6 2015, 18:08:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import cPickle as pickle
>>> string = "X"*(2**31)
>>> pp = pickle.dumps(string)
>>> len(pp)
2147483656
>>> ss = pickle.loads(pp)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: insecure string pickle
Run Code Online (Sandbox Code Playgroud)
通过在python 3.4(PEP 3154)中引入pickle协议4解决了这一限制.不幸的是,这个功能还没有被反向移植到python 2,而且可能永远都不会.如果这是你的问题,你需要使用python 2泡菜,你可以做的最好的是减少泡菜的大小,例如,而不是酸洗list,将元素单独list腌制成泡菜.