python 3 不会在 msgpack 的 dict 中找到键

Tam*_*mpa 6 python-3.x msgpack

为什么会在python3中发生这种情况?

1)我从redis获取msgpack数据

2)我打开我得到以下

3)返回的类型是一个字典:

meta = msgpack.unpackb(data[1])
print(type(meta))
<class 'dict'>

 meta = {b'api_key': b'apikey1',
        b'sensor_id': b'sid1',
        b'version': b'1.0'}
Run Code Online (Sandbox Code Playgroud)

如果我运行以下命令:sensor_meta['sensor_id']

{b'api_key': b'apikey1',
 b'sensor_id': b'sid1',
 b'version': b'1.0'}
Traceback (most recent call last):
  File "/Users//worker.py", line 247, in <module>
    print(meta['sensor_id'])
KeyError: 'sensor_id'
Run Code Online (Sandbox Code Playgroud)

但是如果我使用 sensor_meta[b'sensor_id'] 那么它就可以了。

什么是“b”,我怎样才能摆脱它?如何转换整个对象以便没有 b ?

所以如果我执行以下操作:

   print(type(meta['sensor_id']))
   <class 'bytes'>
Run Code Online (Sandbox Code Playgroud)

为什么是字节以及它是如何到达那里的?每次我想在散列中使用键时,我都不会附加 ab。

谢谢

Dhr*_*hak 7

正如这里的注释中提到的:

字符串和二进制类型 在过去,msgpack 不像 Python 1 那样区分字符串和二进制类型。表示字符串和二进制类型的类型被命名为 raw。

msgpack 目前可以区分字符串和二进制类型。但它不像 Python 2。Python 2 添加了 unicode 字符串。但是 msgpack 将 raw 重命名为 str 并添加了 bin 类型。这是因为保持与旧库创建的数据的兼容性。raw 用于文本而不是二进制。

目前,虽然 msgpack-python 支持新的 bin 类型,但默认设置不使用它并将 raw 解码为字节而不是 unicode(Python 3 中的 str )。

您可以通过使用 Packer 中的 use_bin_type=True 选项和 Unpacker 中的 encoding=”utf-8” 选项来更改此设置。

>>> import msgpack
>>> packed = msgpack.packb([b'spam', u'egg'], use_bin_type=True)
>>> msgpack.unpackb(packed, encoding='utf-8') ['spam', u'egg']
Run Code Online (Sandbox Code Playgroud)

您可以在解包时定义编码以将字节转换为字符串。

msgpack.unpackb(data[1], encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)