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, потому что он строг в отношении его ввода.