如何解析包含dict的python b'字符串

Son*_*rge 3 python

当我从python3脚本查询hgetallredis时,我得到了以下声明的输出.

data = {
    b'category': b'0',
    b'title': b'1',
    b'display': b'1,2',
    b'type': b'1',
    b'secret': b'this_is_a_salt_key',
    b'client': b'5'}
Run Code Online (Sandbox Code Playgroud)

它是dict类型.

当我试图得到"类别"时

>>> data['category']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'category'
Run Code Online (Sandbox Code Playgroud)

读完后我就这样试了

import ast
>>> ast.literal_eval(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/ast.py", line 84, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python3.4/ast.py", line 83, in _convert
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: {b'category': b'0', b'title': b'1', b'display': b'1,2', b'type': b'1', b'secret': b'this_is_a_salt_key', b'client': b'5'}
Run Code Online (Sandbox Code Playgroud)

也试过用json.dumps.但无法理解真正的问题.

请帮我解析输出并获得所需的结果.

Dan*_*man 10

这不是JSON,因此尝试解析它没有意义.它是一个字典,恰好有字节字符串的键.所以你只需要使用字节字符串来访问这些值:

data[b'category']
Run Code Online (Sandbox Code Playgroud)


hei*_*nst 5

您必须b在键值前面添加 ,因为它是字节字符串:

data[b'category']
Run Code Online (Sandbox Code Playgroud)

如果你想将字节字符串转换为普通字符串,你可以这样做:

data = {b'category': b'0', b'title': b'1', b'display': b'1,2', b'type': b'1', b'secret': b'this_is_a_salt_key', b'client': b'5'}

newData = {str(key): str(value) for (key, value) in data.items()}

print newData
Run Code Online (Sandbox Code Playgroud)