¿Convertir cadena a dict?

Tengo un script que cambia un dictado a una cadena y lo guarda en un archivo. Me gustaría cargar ese archivo y usarlo como un dict, pero es una cadena. ¿Hay algo como int("7") que puede cambiar una cadena formateada como dict ( {a: 1, b: 2} ) en un dict? He intentado dict() , pero esto no parece ser lo que hace. He oído hablar de algún proceso que involucra a JSON y eval() , pero realmente no veo qué hace esto. El progtwig carga los mismos datos que guarda, y si alguien lo edita y no funciona, no es problema mío (no necesito ningún método avanzado para confirmar los datos del dictado ni nada).

Intenta esto, es la forma más segura:

 import ast ast.literal_eval("{'x':1, 'y':2}") => {'y': 2, 'x': 1} 

Todas las soluciones basadas en eval() son peligrosas, el código malicioso podría inyectarse dentro de la cadena y ejecutarse.

Según la documentación, la expresión se evalúa de forma segura. Además, de acuerdo con el código fuente , literal_eval analiza la cadena a un AST de python (árbol de origen), y devuelve solo si es un literal. El código nunca se ejecuta, solo se analiza, por lo que no hay razón para que sea un riesgo de seguridad.

Este formato no es JSON, sino YAML, que puede analizar con PyYAML :

 >>> import yaml >>> s = '{a: 1, b: 2}' >>> d = yaml.load(s) >>> d {'a': 1, 'b': 2} >>> type(d)  

Puede utilizar eval si confía en la cadena de entrada.

 >>> a=eval('{"a":1,"b":2}') >>> a {'a': 1, 'b': 2} 

Publicación por entregas

Lo que estás hablando de hacer es la serialización de objetos , y hay mejores maneras de hacerlo que rodar tu propio método de serialización (aunque pareces haber creado YAML). Ambos son aún menos seguros que el enfoque de ast.literal_eval() (en particular, pickle ), pero definitivamente deben anotarse aquí.

JSON

Este es un ejemplo de cómo hacer lo que quiere con JSON , un popular formato en varios idiomas:

 import json myDict = {'a':1, 'b':2} # write to the file 'data' with open('data','w') as f: json.dump(myDict, f) # now we can load it back with open('data','r') as f: myDictLoaded = json.load(f) print myDictLoaded 

Salida:

 {u'a': 1, u'b': 2} 

conservar en vinagre

Aquí hay un segundo ejemplo haciendo lo mismo usando pickle . pickle es más poderoso porque puede serializar todos los * objetos de python, incluso los que usted escribe.

 import cPickle as pickle myDict = {'a':1, 'b':2} # write to the file 'data' with open('data','w') as f: pickle.dump(myDict, f) # now we can load it back with open('data','r') as f: myDictLoaded = pickle.load(f) print myDictLoaded 

Salida:

 {'a': 1, 'b': 2}