python-ValueError:不安全的字符串pi

当我尝试加载使用cPickle转储的内容时,出现错误消息:

ValueError: insecure string pickle

转储和加载工作都在同一台计算机上完成,因此在同一操作系统上:Ubuntu 8.04。

我该如何解决这个问题?

Peter Long asked 2020-06-20T09:33:20Z

10个解决方案

86 votes

“与Python本身从未见过的bug相比,在全世界每天使用数十亿次的功能中,这种错误的可能性要大得多”:它总是让我感到惊讶,跨平台的人如何进入这些论坛。

解决此问题的一种简单方法是忘记关闭用于转储数据结构的流。 我已经做了

>>> out = open('xxx.dmp', 'w')

>>> cPickle.dump(d, out)

>>> k = cPickle.load(open('xxx.dmp', 'r'))

Traceback (most recent call last):

File "", line 1, in

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'))

容易忘记。 不需要人们被告知他们是白痴。

Allan Ramsay answered 2020-06-20T09:33:48Z

9 votes

由于开放模式“ rb”,我在Python 2.7中遇到此错误:

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

Oleg Neumyvakin answered 2020-06-20T09:34:17Z

8 votes

检查该线程。 彼得·奥滕(Peter Otten)说:

泡菜坏了。 错误是 如果转储中的字符串确实发生,则引发 并非以“或”开头和结尾。

并显示了重现这种“腐败”的简单方法。 在后续文章中,史蒂夫·霍尔顿(Steve Holden)提出了另一种导致该问题的方法,即不匹配“ rb”和“ wb”(但是在Python 2和Linux中,该特殊错误应该忽略不计)。

Alex Martelli answered 2020-06-20T09:34:46Z

7 votes

您正在处理dump()和load()之间的数据吗? 将腌制的数据存储在以文本模式(在Windows上)中打开的文件中或数据库存储中,以对二进制数据不能正常工作的方式(VARCHAR,某些数据库中的TEXT列,某些键值存储)的方式存储,这是一个常见错误。 尝试比较传递给存储并立即从存储中检索的腌制数据。

Denis Otkidach answered 2020-06-20T09:35:06Z

7 votes

如果有人使用sudo apt-get install libav遇到此错误,则此问题已解决:[https://github.com/rg3/youtube-dl/issues/7172#issuecomment-242961695]

要求评论评论于8月28日

sudo apt-get install libav

应该立即在Mac或

sudo apt-get install libav

#在Linux上

Pysis answered 2020-06-20T09:35:48Z

6 votes

如果您的泡菜很大(Python Issue#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 "", line 1, in

ValueError: insecure string pickle

通过在python 3.4(PEP 3154)中引入pickle协议4解决了此限制。 不幸的是,此功能尚未反向移植到python 2,并且可能永远不会移植到python 2。 如果这是您的问题,并且您需要使用python 2泡菜,则最好的方法是减小泡菜的大小,例如,而不是对list进行酸洗,而不是对元素进行酸洗,将其腌制为list。

Paul Price answered 2020-06-20T09:36:13Z

4 votes

在Windows上使用python制作的文件,在Linux上使用python重新加载的文件也存在同样的问题。解决方案:在Linux上阅读之前,先对文件上的dos2unix进行操作!

am_technix answered 2020-06-20T09:36:34Z

3 votes

我以另一种方式收到了urlsafe_b64encode()消息。

对我来说,它发生在urlsafe_b64encode()对二进制文件进行编码并通过urllib2套接字之后。

最初我是在包装这样的文件

with open(path_to_binary_file) as data_file:

contents = data_file.read()

filename = os.path.split(path)[1]

url = 'http://0.0.0.0:8080/upload'

message = {"filename" : filename, "contents": contents}

pickled_message = cPickle.dumps(message)

base64_message = base64.b64encode(pickled_message)

the_hash = hashlib.md5(base64_message).hexdigest()

server_response = urllib2.urlopen(url, base64_message)

但是在服务器上,对于某些二进制文件,哈希值以不同的方式出现

decoded_message = base64.b64decode(incoming_base64_message)

the_hash = hashlib.md5(decoded_message).hexdigest()

和解开给urlsafe_b64encode()消息

cPickle.loads(decoded_message)

但是成功

对我有用的是使用urlsafe_b64encode()

base64_message = base64.urlsafe_b64encode(cPickle.dumps(message))

并用

base64_decoded_message = base64.urlsafe_b64decode(base64_message)

参考文献

[HTTP://docs.Python.org/2/library/巴塞64.HTML]

[HTTPS://tools.I ETF.org/HTML/RFC3548.HTML#section-3]

HeyWatchThis answered 2020-06-20T09:37:38Z

1 votes

这就是我所发生的事情,可能只是一小部分人,但是我还是想在这里为他们介绍一下:

解释器(Python3)会给您一个错误,指出它要求输入文件流以字节为单位,而不是字符串,并且您可能已将打开模式参数从'r'更改为'rb',现在是 告诉您字符串已损坏,这就是为什么您来这里。

在这种情况下,最简单的选择是安装Python2(可以安装2.7),然后在Python 2.7环境下运行程序,这样它就可以释放文件而不会出现问题。 基本上,当我要做的只是将打开文件的模式从rb更改为r,然后使用Python2解开文件时,我浪费了很多时间来查看字符串是否确实损坏。 所以我只是把这些信息放在那里。

Arijit answered 2020-06-20T09:38:08Z

0 votes

我较早地遇到了这个问题,找到了这个线程,并假设我不受几个答案中提到的文件关闭问题的影响,因为我使用的是with语句:

with tempfile.NamedTemporaryFile(mode='wb') as temp_file:

pickle.dump(foo, temp_file)

# Push file to another machine

_send_file(temp_file.name)

但是,由于我是从with内部推送临时文件的,因此该文件仍未关闭,因此我推送的文件被截断了。 这导致在读取远程计算机上的文件的脚本中出现相同的insecure string pickle错误。

对此的两个潜在修复:保持文件打开并强制刷新:

with tempfile.NamedTemporaryFile(mode='wb') as temp_file:

pickle.dump(foo, temp_file)

temp_file.flush()

# Push file to another machine

_send_file(temp_file.name)

或者在执行任何操作之前确保文件已关闭:

file_name = ''

with tempfile.NamedTemporaryFile(mode='wb', delete=False) as temp_file:

file_name = temp_file.name

pickle.dump(foo, temp_file)

# Push file to another machine

_send_file(file_name)

0x5453 answered 2020-06-20T09:38:42Z

python中valueerror是什么意思_python-ValueError:不安全的字符串pi相关推荐

  1. python中函数startswith的用法_Python中用startswith()函数判断字符串开头的教程

    函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头 一.函数说明语法:string.startswith(str, beg=0,end=len(string)) 或strin ...

  2. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  3. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

  4. python中异或怎么算_python 异或运算的前提_异或运算公式

    Python基础(10)–数字-Python-第七城市 609x288 - 73KB - JPEG Python基础(10)--数字_资讯_突袭网 609x288 - 33KB - JPEG pyth ...

  5. python中最基本的系列_Python中最基本的10个内容

    Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解一些Python中最基本的内容. Python的特点 ...

  6. 站长在线Python精讲:在Python中使用split()方法分割、使用join()方法合并字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用split()方法分割.使用join()方法合并字符串详解>.本知识点主要内容有:在Python中使用s ...

  7. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  8. python中find函数忽略大小写_python字符串(大小写、判断、查找、分割、拼接、裁剪、替换、格式化)...

    一.通用操作 1.Python len() 方法返回对象(字符.列表.元组等)长度或项目个数. 语法 len()方法语法: len( q ) 参数 q -- 对象. 返回值 返回对象长度. 实例 以下 ...

  9. python中startout是什么意思_Python socket.timeout方法代碼示例

    本文整理匯總了Python中gevent.socket.timeout方法的典型用法代碼示例.如果您正苦於以下問題:Python socket.timeout方法的具體用法?Python socket ...

最新文章

  1. 访问级别约束0906
  2. Linux arm9 设置中断向量表,STM32学习笔记之中断向量表,MDK程序启动分析
  3. linux 进程间通信之pipe
  4. python爬虫爬取ip记录网站信息并存入数据库
  5. Node.js读取mongoDB并输出json数据
  6. 熬了整整30天,java工作流开发
  7. [转]OpenGL基础技术讲座--发展历史
  8. Java飞机大战超全版(plus版)
  9. 使用dll查看器dll文件中的内容
  10. Scratch编程入门
  11. 四轴飞行器基础介绍篇
  12. SQL基础教程【日】MICK著 孙淼 罗勇译 ISBN 978-7-115-32269-2
  13. 逆矩阵的六个注意事项
  14. 计算机和数学专业哪个难,学计算机专业难吗 数学很差能学吗
  15. 无领导小组讨论题目分类
  16. 大道至简:大数据、小数据、量化交易
  17. 还在用电脑多控手机?你out了,手机多控手机,全新神器
  18. 图像处理学习 灰度图像与二值图像
  19. 让ChatGPT成为你的人工智能好友
  20. Java语法(全面解析)

热门文章

  1. Codeforces 332B Maximum Absurdity(DP+前缀和处理)
  2. python ppt 图片_利用Python将PPT转换为图片并合成长图
  3. Clinical Chemistry | 张建中/徐健开发幽门螺杆菌单细胞精准诊疗技术
  4. 编写一个判别素数(质数)的函数 int isPrime(int x)。在 main 函数中,输入一个正整数 n,输出 1~n 之间的所有素数以及素数的个数
  5. 直方图规定化、均衡化变换—Matlab数字图像处理(三)
  6. iOS 音频视频制作
  7. xstart下远程报错已拒绝X11转移申请的解决方法
  8. oracle安装使用
  9. SDL游戏开发之一-SDL的简介
  10. oracle配置odbc数据源