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