如何将字节类型转换为字典

95
我有一个像这样的bytes类型的对象。
b"{'one': 1, 'two': 2}"

我需要使用Python代码从上述字节类型对象中获取正确的Python字典。
string = b"{'one': 1, 'two': 2}"
d = dict(toks.split(":") for toks in string.split(",") if toks)

但是我遇到了以下错误:
------> d = dict(toks.split(":") for toks in string.split(",") if toks)
TypeError: 'bytes' object is not callable

1
不需要自己编写字典解析器。将字符串发送到 ast.literal_eval - Patrick Haugh
你在这里发布的代码并没有引发那个异常。实际上,它几乎做到了你想要它做的事情(除了处理引号字符方面有一些错误——例如,你最终会得到一个像 " 'two'" 而不是 "two" 的键)。 - abarnert
1
同时,这个输入是从哪里来的?将 Python 字典的 repr 转换为 UTF-8 编码真的不是一种好的存储数据以便稍后加载的方式。更好的方法是使用类似 JSON 或 Pickle 的东西。 - abarnert
1
@Aran-Fey 字节与字符串不同。 - Willy satrio nugroho
5个回答

137
我认为还需要进行解码,才能得到一个合适的字典。
a= b"{'one': 1, 'two': 2}"
ast.literal_eval(a.decode('utf-8'))
**Output:** {'one': 1, 'two': 2}

被接受的答案会产生

a= b"{'one': 1, 'two': 2}"
ast.literal_eval(repr(a))
**output:**  b"{'one': 1, 'two': 2}"

literal_eval在我的许多代码中处理得不好,所以我个人更喜欢使用json模块进行处理。

import json
a= b"{'one': 1, 'two': 2}"
json.loads(a.decode('utf-8'))
**Output:** {'one': 1, 'two': 2}

57

你所需要的只是 ast.literal_eval。没有比它更复杂的需要。除非你在字符串中特意使用非Python字典语法,否则没有理由去处理JSON。

# python3
import ast
byte_str = b"{'one': 1, 'two': 2}"
dict_str = byte_str.decode("UTF-8")
mydata = ast.literal_eval(dict_str)
print(repr(mydata))

请看答案这里。它还详细介绍了ast.literal_evaleval更安全。


5
似乎需要进行额外的解码。 错误日志: raise ValueError('malformed node or string: ' + repr(node)) ValueError: malformed node or string: b"{'one': 1, 'two': 2}" - Zhi Yuan

20

你可以像这样尝试:

import json
import ast

a= b"{'one': 1, 'two': 2}"
print(json.loads(a.decode("utf-8").replace("'",'"')))

print(ast.literal_eval(a.decode("utf-8")))

这是模块的文档:

1. ast文档

2. json文档


6

您可以使用Base64库将字符串字典转换为字节,并且可以使用json库将字节结果转换为字典。尝试下面的示例代码。

import base64
import json


input_dict = {'var1' : 0, 'var2' : 'some string', 'var1' : ['listitem1','listitem2',5]}

message = str(input_dict)
ascii_message = message.encode('ascii')
output_byte = base64.b64encode(ascii_message)

msg_bytes = base64.b64decode(output_byte)
ascii_msg = msg_bytes.decode('ascii')
# Json library convert stirng dictionary to real dictionary type.
# Double quotes is standard format for json
ascii_msg = ascii_msg.replace("'", "\"")
output_dict = json.loads(ascii_msg) # convert string dictionary to dict format

# Show the input and output
print("input_dict:", input_dict, type(input_dict))
print()
print("base64:", output_byte, type(output_byte))
print()
print("output_dict:", output_dict, type(output_dict))

enter image description here


-4

简单

data = eval(b"{'one': 1, 'two': 2}")

4
这不是一个好的选择:为什么使用"eval"是一种不好的编程实践? - Trenton McKinney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接