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。
谢谢
正如这里的注释中提到的:
字符串和二进制类型 在过去,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)
| 归档时间: |
|
| 查看次数: |
1490 次 |
| 最近记录: |