2016-04-01 12 views
1

Wie kann ich diese Zeichenfolge unten von Python3 in eine Json konvertieren?Konvertieren von String von Python3 in dict

Dies ist mein Code:

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) 

von Python2 Laufen bekomme ich:

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

von Python3 Laufen bekomme ich:

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

Wie kann ich von Python3 laufen und bekommen das gleiche Ergebnis wie Python2?

+0

Für Py3: chunk.decode ('utf8') oder mystr.decode ('utf8') – AndreyT

Antwort

3

Was haben Sie in mystr ist in bytes Format, nur decode es in ascii und dann auswerten:

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

Oder in einem allgemeineren Fall zu vermeiden, Probleme mit Unicodes Zeichen,

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

Und seit, Standard-Decodierungsschema ist utf-8, die Sie sehen können:

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

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

Dann müssen Sie nicht das Codierungsschema angeben:

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

Gute Antwort, ich habe einige Informationen über die Quelle der Verwirrung, nämlich das 'b' Präfix, zu einer Antwort hinzugefügt unten. Fühlen Sie sich frei, das in Ihre eigene Antwort zu bearbeiten, wenn Sie denken, dass es anderen Lesern helfen wird. –

+1

@TomRees ... Lass es für deine Antwort, du hast Mühe dafür, also musst du belohnt werden ...;) –

+0

ja !!! Danke :) – waas1919

2

Iron Fist mich zu dem Update verloren. Um seine Antwort zu erweitern, gibt das Präfix 'b' in der Zeichenfolge (für python3, aber nicht für python2) an, dass das Literal als Bytefolge und nicht als Zeichenfolge interpretiert werden soll.

Das Ergebnis ist, dass die .decode-Methode benötigt wird, um die Bytes zurück in eine Zeichenfolge zu konvertieren. Python2 macht diese Unterscheidung zwischen den Bytes und Strings nicht, daher der Unterschied.

Weitere Informationen hierzu finden Sie unter What does the 'b' character do in front of a string literal?.