Como posso converter a str
representação de a dict
, como a seguinte string, em uma dict
?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Eu prefiro não usar eval
. O que mais posso usar?
A principal razão para isso, é uma das minhas aulas de colegas de trabalho que ele escreveu, converte todas as entradas em strings. Não estou com disposição para modificar suas aulas, para lidar com esse problema.
python
string
dictionary
UberJumper
fonte
fonte
"
null
true
false
None
True
False
Respostas:
A partir do Python 2.6, você pode usar o built-in
ast.literal_eval
:Isso é mais seguro do que usar
eval
. Como seus próprios documentos dizem:Por exemplo:
fonte
"dict(a=1)"
cordas de estilo?https://docs.python.org/3.8/library/json.html
O JSON pode resolver esse problema, embora seu decodificador deseje aspas duplas em torno de chaves e valores. Se você não se importa com um hack de substituição ...
Observe que se você tiver aspas simples como parte de suas chaves ou valores, isso falhará devido à substituição incorreta de caracteres. Esta solução é recomendada apenas se você tiver uma forte aversão à solução de avaliação.
Mais sobre aspas simples de json: jQuery.parseJSON lança erro "JSON inválido" devido a aspas simples escapadas em JSON
fonte
{"foo": "b'ar"}
{'foo': (1, 2, 3)}
+1
para informar que o decodificador deseja aspas duplas em torno de chaves e valores."{0: 'Hello'}"
.usando
json.loads
:fonte
Para o exemplo do OP:
Podemos usar o Yaml para lidar com esse tipo de json não padrão em string:
fonte
Se a string sempre puder ser confiável, você poderá usar
eval
(ou usarliteral_eval
como sugerido; é seguro, não importa qual seja a string). Caso contrário, você precisará de um analisador. Um analisador JSON (como simplejson) funcionaria se ele apenas armazenasse conteúdo compatível com o esquema JSON.fonte
Use
json
. aast
biblioteca consome muita memória e mais devagar. Eu tenho um processo que precisa ler um arquivo de texto de 156Mb.Ast
com atraso de 5 minutos para o dicionário de conversãojson
e 1 minuto usando 60% menos memória!fonte
Para resumir:
Resultados:
Conclusão: prefira json.loads
fonte
fonte
{
ou}
. E se estiver aninhadodict
. E se o valor contiver,
??nenhuma libs é usada:
NOTA: Como codificado permanentemente
split("'")
, funcionará apenas para cadeias de caracteres em que os dados são "entre aspas simples".fonte