Python3取消勾选字节对象的字符串表示形式

Python3取消勾选字节对象的字符串表示形式,python,python-3.x,pickle,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_o

有没有一种好方法可以加载一个表示为字符串的字节对象,这样它就可以被取消勾选

基本示例 下面是一个愚蠢的例子:

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
似乎是错误的,尤其是当字符串可能来自网络或文件时

有没有更好的解决方案的建议


谢谢

对于安全问题,您可以使用而不是
eval

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

你有理由把它作为str吗?如果您只是将其写入文件,则可以使用“wb”而不是“w”。()


您可以使用
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}

首先,我不会使用pickle来序列化数据。而是使用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来序列化数据

我认为最好不要将字节转换为str。有什么方法可以避免这种转换吗?@很快我就要处理其他人的文件了。。。将他们的文件更改为使用二进制数据肯定会更好。。。但是现在,我无法避免字符串转换。对网络数据使用pickle不是一个好主意。顺便问一下:你知道文件的编码是什么吗?如果您这样做,那么您只需对要取消勾选的字符串进行
str.encode
即可。如果你不知道的话,你需要先猜一下编码。@JacquesGaudin不确定我是否理解。字符串的编码是什么?我知道这个文件是utf-8,但我想我所能做的就是用已知的编码获得字符串表示,我仍然需要评估。。。或者你是说@Farhan.K提供的答案?不幸的是,不是我的文件,我只是在处理我得到的!谢谢回答得很好。更安全的评估,只需要一些额外的错误处理。
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)