Wie kann ich die str
Darstellung von a dict
, z. B. der folgenden Zeichenfolge, in a konvertieren dict
?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Ich bevorzuge es nicht zu benutzen eval
. Was kann ich noch verwenden?
Der Hauptgrund dafür ist, dass eine meiner Kollegenklassen, die er geschrieben hat, alle Eingaben in Zeichenfolgen umwandelt. Ich bin nicht in der Stimmung, seine Klassen zu modifizieren, um dieses Problem zu lösen.
python
string
dictionary
UberJumper
quelle
quelle
"
Ihre Zeichenfolgen doppelte Anführungszeichen enthalten, verfügen Sie wahrscheinlich über JSON-Daten. Sie können auch einen Blicknull
,true
oderfalse
, Python - Syntax verwendetNone
,True
undFalse
.Antworten:
Ab Python 2.6 können Sie Folgendes verwenden
ast.literal_eval
:Dies ist sicherer als die Verwendung
eval
. Wie seine eigenen Dokumente sagen:Zum Beispiel:
quelle
"dict(a=1)"
Style-Strings?https://docs.python.org/3.8/library/json.html
JSON kann dieses Problem lösen, obwohl sein Decoder doppelte Anführungszeichen um Schlüssel und Werte wünscht. Wenn Ihnen ein Ersatz-Hack nichts ausmacht ...
HINWEIS: Wenn Sie einfache Anführungszeichen als Teil Ihrer Schlüssel oder Werte haben, schlägt dies aufgrund einer nicht ordnungsgemäßen Zeichenersetzung fehl. Diese Lösung wird nur empfohlen, wenn Sie eine starke Abneigung gegen die Bewertungslösung haben.
Weitere Informationen zu json-Anführungszeichen: jQuery.parseJSON löst den Fehler "Ungültiger JSON" aus, da in JSON ein einfaches Anführungszeichen enthalten ist
quelle
{"foo": "b'ar"}
{'foo': (1, 2, 3)}
+1
zum Informieren, dass der Decoder doppelte Anführungszeichen um Schlüssel und Werte wünscht."{0: 'Hello'}"
.mit
json.loads
:quelle
Zum Beispiel von OP:
Wir können Yaml verwenden , um mit dieser Art von nicht standardmäßigem JSON in Zeichenfolgen umzugehen:
quelle
Wenn der Zeichenfolge immer vertraut werden kann, können Sie sie verwenden
eval
(oderliteral_eval
wie vorgeschlagen verwenden; es ist sicher, egal was die Zeichenfolge ist). Andernfalls benötigen Sie einen Parser. Ein JSON-Parser (wie simplejson) würde funktionieren, wenn er nur Inhalte speichert, die zum JSON-Schema passen.quelle
Verwenden Sie
json
. Dieast
Bibliothek verbraucht viel Speicher und ist langsamer. Ich habe einen Prozess, der eine Textdatei von 156 MB lesen muss.Ast
mit 5 Minuten Verzögerung für das Konvertierungswörterbuchjson
und 1 Minute mit 60% weniger Speicher!quelle
Zusammenfassen:
Ergebnisse:
Fazit: lieber json.loads
quelle
quelle
{
oder}
. Was passiert , wenn es eingebettet istdict
. Was ist, wenn Wert enthält,
?Es werden keine Bibliotheken verwendet:
HINWEIS: Da es fest codiert
split("'")
ist, funktioniert es nur für Zeichenfolgen, bei denen Daten in einfachen Anführungszeichen stehen.quelle