texto - lista de diccionarios python
Python: crea un diccionario a partir de texto/archivo que está en formato de diccionario (6)
Aunque no me gusta mucho usar eval
. Puede resultar en problemas de seguridad si no tiene control total sobre el archivo de entrada. Solo importa tu diccionario y json
usando el módulo json
o pickle
.
Me gustaría crear un diccionario a partir de un archivo de texto que tengo, cuyos contenidos están en formato ''diccionario''. Aquí hay una muestra de lo que contiene el archivo:
{''fawn'': [1], ''sermersheim'': [3], ''sonji'': [2], ''scheuring'': [2]}
Es exactamente esto, excepto que contiene 125,000 entradas. Puedo leer en el archivo de texto usando read (), pero crea una variable del texto literal del archivo, incluso cuando inicializo la variable con
dict = {}
No es una solución lista para producción y puede que no funcione bien con un archivo de su tamaño, pero si necesita una forma simple y puede anteponer el archivo a
my_dict = {''fawn'': [1], ''sermersheim'': [3], ''sonji'': [2], ''scheuring'': [2]}
luego puede cambiarle el nombre a un archivo python y simplemente importar
from my_file import my_dict
Puedes usar el eval
integrado. Por ejemplo, esto funcionaría si cada entrada del diccionario está en una línea diferente:
dicts_from_file = []
with open(''myfile.txt'',''r'') as inf:
for line in inf:
dicts_from_file.append(eval(line))
# dicts_from_file now contains the dictionaries created from the text file
Alternativamente, si el archivo es solo un gran diccionario (incluso en varias líneas), puede hacer esto:
with open(''myfile.txt'',''r'') as inf:
dict_from_file = eval(inf.read())
Esta es probablemente la forma más sencilla de hacerlo, pero no es la más segura. Como otros mencionaron en sus respuestas, eval
tiene algunos riesgos de seguridad inherentes. La alternativa, como lo menciona JBernardo, es usar ast.literal_eval
que es mucho más seguro que eval ya que solo evaluará cadenas que contienen literales. Simplemente puede reemplazar todas las llamadas a eval
en los ejemplos anteriores con ast.literal_eval
después de importar el módulo ast
.
Si está utilizando Python 2.4, no va a tener el módulo ast
ni a las declaraciones. El código se verá más así:
inf = open(''myfile.txt'',''r'')
dict_from_file = eval(inf.read())
inf.close()
No olvides llamar a inf.close()
. La belleza de las declaraciones es que lo hacen por usted, incluso si el bloque de código en la declaración with
genera una excepción.
Usar eval
podría ser peligroso. Si json no funciona, entonces recomiendo usar yaml que parece funcionar bien con su entrada de ejemplo:
>>> import yaml
>>> yaml.load("{''fawn'': [1], ''sermersheim'': [3], ''sonji'': [2], ''scheuring'': [2]}")
{''fawn'': [1], ''scheuring'': [2], ''sermersheim'': [3], ''sonji'': [2]}
Esto me parece json. Usa el módulo json
si es así.
Esto me parece yaml. Utilice el módulo pyyaml si es así. (Según lo sugerido por @jcollado).
No puede usar el módulo json
porque es estricto con respecto a su entrada.