2016-04-01 14 views
1

この文字列をPython3からJsonに変換するにはどうすればよいですか?Python3からdictに変換する文字列

これは私のコードです:

Python2から実行
import ast 
mystr = b'[{\'1459161763632\': \'this_is_a_test\'}, {\'1459505002853\': "{\'hello\': 12345}"}, {\'1459505708472\': "{\'world\': 98765}"}]' 
chunk = str(mystr) 
chunk = ast.literal_eval(chunk) 
print(chunk) 

私が手:

Python3から実行
[{'1459161763632': 'this_is_a_test'}, {'1459505002853': "{'hello': 12345}"}, {'1459505708472': "{'world': 98765}"}] 

私が手:

b'[{\'1459161763632\': \'this_is_a_test\'}, {\'1459505002853\': "{\'hello\': 12345}"}, {\'1459505708472\': "{\'world\': 98765}"}]' 

にはどうすればPython3から実行して取得することができますPython2と同じ結果ですか?

+0

Py3の場合:chunk.decode( 'utf8')またはmystr.decode( 'utf8') – AndreyT

答えて

3

何がmystrで持っていることはbytes形式であり、ちょうどdecodeそれはasciiにし、それを評価:

>>> ast.literal_eval(mystr.decode('ascii')) 
[{'1459161763632': 'this_is_a_test'}, {'1459505002853': "{'hello': 12345}"}, {'1459505708472': "{'world': 98765}"}] 

以上の一般的なケースでは、ユニコード文字の問題を回避するために、

>>> ast.literal_eval(mystr.decode('utf-8')) 
[{'1459161763632': 'this_is_a_test'}, {'1459505002853': "{'hello': 12345}"}, {'1459505708472': "{'world': 98765}"}] 

デフォルトの復号化方式はutf-8です。

>>> help(mystr.decode) 
Help on built-in function decode: 

decode(...) method of builtins.bytes instance 
    B.decode(encoding='utf-8', errors='strict') -> str 
... 

その後、あなたは符号化方式を指定する必要はありません。

>>> ast.literal_eval(mystr.decode()) 
[{'1459161763632': 'this_is_a_test'}, {'1459505002853': "{'hello': 12345}"}, {'1459505708472': "{'world': 98765}"}] 
+1

幸いです。私は、混乱の原因、つまり「b」接頭辞に関する情報を回答に追加しました以下。それが他の読者に役立つと思えば、あなた自身の答えに自由に編集してください。 –

+1

@TomRees ...あなたの答えのためにそれを保ちましょう、あなたはそれのために努力したので、あなたは報酬を得なければなりません...;) –

+0

はい!!!ありがとうございました :) – waas1919

2

鉄の拳は修正に私を打ちます。彼の答えを拡張するために、文字列の 'b'接頭辞は、文字列ではなくバイト列として解釈されるべきであることを(python3ではなくpython2ではなく)示します。

結果として、バイトを文字列に戻すために.decodeメソッドが必要になります。 Python2では、バイトと文字列の区別が行われないため、違いがあります。

詳細については、What does the 'b' character do in front of a string literal?を参照してください。

関連する問題