Python3 unpickle 字节对象的字符串表示 [英] Python3 unpickle a string representation of bytes object

查看:75
本文介绍了Python3 unpickle 字节对象的字符串表示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有一种好方法可以加载表示为字符串的 bytes 对象,以便对其进行 unpickled?

基本示例

这是一个愚蠢的例子:

进口泡菜mydict = { 'a': 1111, 'b': 2222 }string_of_bytes_obj = str(pickle.dumps(mydict)) # 这个快速示例的特意字符串表示.unpickled_dict = pickle.loads(string_of_bytes_obj) # 错误!Loads 接受类似字节的对象而不是字符串.

尝试解决方案

一种解决方案当然是eval字符串:

unpickled_dict = pickle.loads(eval(string_of_bytes_obj))

但是,eval 似乎是错误的,尤其是当字符串可能来自网络或来自文件时.

...

对更好的解决方案有什么建议吗?

谢谢!

解决方案

出于安全考虑,您可以使用 ast.literal_eval 而不是 eval:

<预><代码>>>>进口AST>>>pickle.loads(ast.literal_eval(string_of_bytes_obj)){'b':2222,'a':1111}

Is there a good way to load a bytes object that is represented as a string, so it can be unpickled?

Basic Example

Here is a dumb example:

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = str(pickle.dumps(mydict)) # Deliberate string representation for this quick example.

unpickled_dict = pickle.loads(string_of_bytes_obj) # ERROR!  Loads takes bytes-like object and not string.

Attempt at a Solution

One solution is of course to eval the string:

unpickled_dict = pickle.loads(eval(string_of_bytes_obj))

But, seems wrong to eval, especially when the strings might be coming over a network or from a file.

...

Any suggestions for a better solution?

Thanks!

解决方案

For a safety concern you can use ast.literal_eval instead of eval:

>>> import ast
>>> pickle.loads(ast.literal_eval(string_of_bytes_obj))
{'b': 2222, 'a': 1111}

这篇关于Python3 unpickle 字节对象的字符串表示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆