Jak przekonwertować str
reprezentację a dict
, na przykład następującego ciągu, na a dict
?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Wolę nie używać eval
. Czego jeszcze mogę użyć?
Głównym tego powodem jest jedna z moich klas współpracowników, którą napisał, konwertuje wszystkie dane wejściowe na ciągi. Nie jestem w nastroju, aby iść i modyfikować jego zajęcia, aby rozwiązać ten problem.
python
string
dictionary
UberJumper
źródło
źródło
"
podwójne cudzysłowy wokół swoich ciągów, prawdopodobnie masz dane JSON. Możesz także poszukaćnull
,true
lubfalse
, używa składni PythonNone
,True
iFalse
.Odpowiedzi:
Począwszy od Python 2.6, możesz użyć wbudowanego
ast.literal_eval
:Jest to bezpieczniejsze niż używanie
eval
. Jak mówią własne dokumenty:Na przykład:
źródło
"dict(a=1)"
ciągami stylów?https://docs.python.org/3.8/library/json.html
JSON może rozwiązać ten problem, chociaż jego dekoder chce podwójnych cudzysłowów wokół kluczy i wartości. Jeśli nie masz nic przeciwko zamianie hacka ...
UWAGA: jeśli masz pojedyncze cudzysłowy jako część swoich kluczy lub wartości, to się nie powiedzie z powodu niewłaściwej zamiany znaków. To rozwiązanie jest zalecane tylko, jeśli masz silną awersję do rozwiązania ewaluacyjnego.
Więcej informacji o pojedynczym cytacie json: jQuery.parseJSON zgłasza błąd „Nieprawidłowy JSON” z powodu zmiany pojedynczego cytatu w JSON
źródło
{"foo": "b'ar"}
{'foo': (1, 2, 3)}
+1
za poinformowanie, że dekoder chce podwójnych cudzysłowów wokół kluczy i wartości."{0: 'Hello'}"
.za pomocą
json.loads
:źródło
Do przykładu OP:
Możemy używać Yamla do radzenia sobie z tego rodzaju niestandardowymi plikami Json w łańcuchu:
źródło
Jeśli ciągowi zawsze można zaufać, możesz użyć
eval
(lub użyćliteral_eval
zgodnie z sugestią; jest bezpieczny bez względu na ciąg.) W przeciwnym razie potrzebujesz parsera. Parser JSON (taki jak simplejson) działałby, gdyby kiedykolwiek przechowywał tylko zawartość zgodną ze schematem JSON.źródło
Zastosowanie
json
.ast
biblioteka zużywa dużo pamięci i i wolniejsze. Mam proces, który musi odczytać plik tekstowy 156Mb.Ast
z 5-minutowym opóźnieniem dla słownika konwersjijson
i 1 minutą przy zużyciu 60% mniej pamięci!źródło
Podsumowując:
Wyniki:
Wniosek: wolę json.loads
źródło
źródło
{
lub}
. Co jeśli jest zagnieżdżonydict
. Co jeśli wartość zawiera,
?nie są używane żadne biblioteki lib:
UWAGA: Ponieważ jest zakodowany na stałe,
split("'")
będzie działał tylko dla ciągów, w których dane są „pojedynczymi cudzysłowami”.źródło