Python3释放字节对象的字符串表示形式

时间:2018-10-19 10:51:15

标签: python python-3.x pickle

是否有一种好的方法来加载表示为字符串的字节对象,以便可以将其取消腌制?

基本示例

这是一个愚蠢的例子:

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.

尝试解决方案

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

unpickled_dict = pickle.loads(eval(string_of_bytes_obj))

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

...

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

谢谢!

4 个答案:

答案 0 :(得分:2)

出于安全考虑,您可以使用ast.literal_eval代替eval

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

答案 1 :(得分:0)

您是否有理由将其作为str?如果只是将其写入文件,则可以使用“ wb”代替“ w”。 (https://pythontips.com/2013/08/02/what-is-pickle-in-python/

{{1}}

答案 2 :(得分:0)

您可以使用encoding="latin1"作为str的参数,然后使用bytes进行转换:

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = str(pickle.dumps(mydict), encoding="latin1")

unpickled_dict = pickle.loads(bytes(string_of_bytes_obj, "latin1"))

输出:

>>> print(unpickled_dict)
{'a': 1111, 'b': 2222}

答案 3 :(得分:0)

首先,我不会使用泡菜来序列化数据。而是使用Json。

我的泡菜解决方案

import pickle

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

但是带有json

import json

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = json.dumps(mydict) 
print(string_of_bytes_obj)
unpickled_dict = json.loads(string_of_bytes_obj)
print(unpickled_dict)

我强烈建议您使用json序列化数据