2017-10-26 3 views
1

왜 python3에서이 문제가 발생합니까? 나는 아래 실행하면python 3은 msgpack의 dict에서 키를 찾지 못합니다.

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'} 

:

1) 나는 내가이

3) 반환 유형 아래에 DICT이다 얻을 풀고)

2

레디 스에서 msgpack 데이터를 얻을 : sensor_meta

{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' 

를 [ 'sensor_id']하지만 난 sensor_meta [b'sensor_를 사용하는 경우 id '] 그러면 작동합니다.

"b"란 무엇이며 어떻게 없앨 수 있습니까? b가 없도록 전체 개체를 어떻게 변환합니까?

그래서 아래의 할 경우 :

print(type(meta['sensor_id'])) 
    <class 'bytes'> 

왜 바이트 어떻게 거기에 도착 했습니까? 해시 키를 사용할 때마다 b를 추가하지 않아도됩니다.

감사 노트 here에서 언급 한 바와 같이

+0

하면 데이터 [1]'뿐만 아니라 – yash

+0

무관 ... 데이터 [1] 내가 풀고 싶은 데이터가 – Tampa

+0

를 나열되어 있지만 공식적으로 메타 정의 '에 대한 정보를 추가 할 수 있습니다 – Tampa

답변

2

:

문자열과 옛날에 진 유형, msgpack 파이썬 1. 같은 문자열 및 바이너리 형식을 구분하지 않습니다에 대한 유형은 문자열을 대표하고 바이너리 형식의 이름은 raw입니다.

msgpack은 현재 문자열과 이진 유형을 구분할 수 있습니다. 그러나 파이썬 2와 마찬가지로 이 아닙니다. 파이썬 2는 유니 코드 문자열을 추가했습니다. 그러나 msgpack은 raw 의 이름을 str로 변경하고 bin 유형을 추가했습니다. 이전 libs에 의해 생성 된 데이터 과의 호환성을 유지하기 때문입니다. raw는 바이너리 이상의 텍스트 용으로 사용되었습니다.

현재, msgpack - 파이썬 새로운 빈 유형을 지원하지만, 기본적으로는 사용하지 않습니다 을 설정하고 대신 유니 코드 (캐릭터 파이썬 3)의 바이트로 원시 디코딩.

패커의 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'] 

당신은 인코딩을 정의 할 수 있습니다. 데이터의

msgpack.unpackb(data[1], encoding='utf-8')