2017-10-26 4 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)返されたタイプの下に辞書で取得解凍) のRedisからmsgpackデータを取得します: 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' 

が、私は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が表す文字列の文字列 やPythonの1のようなバイナリタイプの種類を区別していないと バイナリタイプの名前はrawです。

msgpackは現在、文字列とバイナリの種類を区別できます。しかし、Python 2のように ではありません。Python 2はunicode文字列を追加しました。しかし、msgpackはraw をstrにリネームしてbinタイプを追加しました。それは古いライブラリによって作成されたデータ との互換性を維持するためです。 rawはバイナリ以上のテキストに使用されていました。

現在、msgpack-Pythonは新しいビンタイプをサポートしながら、デフォルトではそれを使用しない を設定し、代わりにユニコード(STR でPythonの3)のバイトとして生デコードします。

これは、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'] 

文字列にあなたのバイトを変換するために、開梱しているときは、エンコーディングを定義することができます。

msgpack.unpackb(data[1], encoding='utf-8') 
関連する問題