¿Cómo puedo convertir la str
representación de a dict
, como la siguiente cadena, en a dict
?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Yo prefiero no utilización eval
. ¿Qué más puedo usar?
La razón principal de esto, es una de mis clases de compañeros de trabajo que escribió, convierte todas las entradas en cadenas. No estoy de humor para ir y modificar sus clases, para lidiar con este problema.
python
string
dictionary
UberJumper
fuente
fuente
"
null
true
false
None
True
False
Respuestas:
A partir de Python 2.6, puede usar el incorporado
ast.literal_eval
:Esto es más seguro que usarlo
eval
. Como dicen sus propios documentos:Por ejemplo:
fuente
"dict(a=1)"
cadenas de estilo?https://docs.python.org/3.8/library/json.html
JSON puede resolver este problema, aunque su decodificador quiere comillas dobles alrededor de claves y valores. Si no te importa reemplazar un truco ...
NOTA: si tiene comillas simples como parte de sus claves o valores, esto fallará debido a un reemplazo incorrecto de caracteres. Esta solución solo se recomienda si tiene una fuerte aversión a la solución eval.
Más acerca de la comilla simple de json: jQuery.parseJSON arroja el error "JSON no válido" debido a una comilla simple escapada en JSON
fuente
{"foo": "b'ar"}
{'foo': (1, 2, 3)}
+1
para informar que el decodificador quiere comillas dobles alrededor de claves y valores."{0: 'Hello'}"
.utilizando
json.loads
:fuente
Para el ejemplo de OP:
Podemos usar Yaml para tratar este tipo de json no estándar en cadena:
fuente
Si siempre se puede confiar en la cadena , puede usar
eval
(o usarliteral_eval
como se sugiere; es seguro sin importar cuál sea la cadena). De lo contrario, necesita un analizador. Un analizador JSON (como simplejson) funcionaría si solo almacena contenido que se ajuste al esquema JSON.fuente
Uso
json
. laast
biblioteca consume mucha memoria y más lento. Tengo un proceso que necesita leer un archivo de texto de 156Mb.Ast
¡con 5 minutos de retraso para el diccionario de conversiónjson
y 1 minuto con un 60% menos de memoria!fuente
Para resumir:
Resultados:
Conclusión: prefiera json.loads
fuente
fuente
{
o}
. ¿Qué pasa si está anidadodict
? ¿Qué pasa si el valor contiene,
?no se utilizan libs:
NOTA: Como se ha codificado
split("'")
, funcionará solo para cadenas en las que los datos están "entre comillas simples".fuente