Python3 unpickle 字节对象的字符串表示
Python3 unpickle a string representation of bytes object
是否有加载表示为字符串的 bytes 对象的好方法,以便可以对其进行 unpickled?
基本示例
这是一个愚蠢的例子:
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
似乎是错误的,尤其是当字符串可能来自网络或文件时。
...
对更好的解决方案有什么建议吗?
谢谢!
出于安全考虑,您可以使用 ast.literal_eval
而不是 eval
:
>>> import ast
>>> pickle.loads(ast.literal_eval(string_of_bytes_obj))
{'b': 2222, 'a': 1111}
有什么理由需要将它作为 str 吗?如果您只是将其写入文件,则可以 'wb' 而不是 'w'。 (https://pythontips.com/2013/08/02/what-is-pickle-in-python/)
import pickle
mydict = { 'a': 1111, 'b': 2222 }
dumped = pickle.dumps(mydict)
string_of_bytes_obj = str(dumped) # Deliberate string representation for this quick example.
unpickled_dict = pickle.loads(dumped)
您可以使用 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}
首先我不会使用泡菜来序列化数据。而是使用 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 序列化您的数据
是否有加载表示为字符串的 bytes 对象的好方法,以便可以对其进行 unpickled?
基本示例
这是一个愚蠢的例子:
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
似乎是错误的,尤其是当字符串可能来自网络或文件时。
...
对更好的解决方案有什么建议吗?
谢谢!
出于安全考虑,您可以使用 ast.literal_eval
而不是 eval
:
>>> import ast
>>> pickle.loads(ast.literal_eval(string_of_bytes_obj))
{'b': 2222, 'a': 1111}
有什么理由需要将它作为 str 吗?如果您只是将其写入文件,则可以 'wb' 而不是 'w'。 (https://pythontips.com/2013/08/02/what-is-pickle-in-python/)
import pickle
mydict = { 'a': 1111, 'b': 2222 }
dumped = pickle.dumps(mydict)
string_of_bytes_obj = str(dumped) # Deliberate string representation for this quick example.
unpickled_dict = pickle.loads(dumped)
您可以使用 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}
首先我不会使用泡菜来序列化数据。而是使用 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 序列化您的数据