Python: создание словаря из текста/файла в формате словаря
Я хотел бы создать словарь из текстового файла, который у меня есть, содержимое которого находится в формате словаря. Вот пример того, что содержит файл:
{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}
Именно это, кроме этого, содержит 125 000 записей. Я могу читать в текстовом файле, используя read(), но он создает переменную буквального текста файла, даже когда я инициализирую переменную с помощью
dict = {}
Ответы
Ответ 1
Вы можете использовать встроенный eval
. Например, это будет работать, если каждая запись словаря находится в другой строке:
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
В качестве альтернативы, если файл является только одним большим словарем (даже на нескольких строках), вы можете сделать это:
with open('myfile.txt','r') as inf:
dict_from_file = eval(inf.read())
Это, наверное, самый простой способ сделать это, но это не самый безопасный. Как упоминалось в ответах других, eval
имеет некоторые собственные риски безопасности. Альтернатива, как упоминалось JBernardo, заключается в использовании ast.literal_eval
, который намного безопаснее, чем eval, поскольку он будет оценивать только строки, содержащие литералы. Вы можете просто заменить все вызовы на eval
в приведенных выше примерах с помощью ast.literal_eval
после импорта модуля ast
.
Если вы используете Python 2.4, у вас не будет модуля ast
, и вы не будете иметь with
. Код будет выглядеть примерно так:
inf = open('myfile.txt','r')
dict_from_file = eval(inf.read())
inf.close()
Не забудьте вызвать inf.close()
. Красота операторов with
заключается в том, что они делают это за вас, даже если блок кода в выражении with
вызывает исключение.
Ответ 2
Использование eval
может быть опасным. Если json не работает, я рекомендую использовать yaml, который, кажется, отлично работает с вашим примером ввода:
>>> import yaml
>>> yaml.load("{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}")
{'fawn': [1], 'scheuring': [2], 'sermersheim': [3], 'sonji': [2]}
Ответ 3
Используйте eval.
Например,
dict = eval(open("yourfile.txt").read())
Ответ 4
Я очень не рекомендую использовать eval
. Это может привести к проблемам безопасности, если у вас нет полного контроля над входным файлом. Просто импортируйте словарь и сохраните его с помощью модуля json
или pickle
.
Ответ 5
Это не готовое решение для производства и может плохо работать с файлом вашего размера, но если вам нужен простой способ и вы можете добавить файл к
my_dict = {'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}
то вы можете переименовать его в файл python и просто импортировать
from my_file import my_dict
Ответ 6
Это выглядит как json для меня. Используйте модуль json
, если это так.
Это выглядит как ямль для меня. Используйте модуль pyyaml , если это так. (Как было предложено @jcollado).
Вы не можете использовать модуль json
, потому что он строг относительно его ввода.