Python: создание словаря из текста / файла в формате словаря


Я хотел бы создать словарь из текстового файла, который у меня есть, содержимое которого находится в формате "словарь". Вот пример того, что содержит файл:

{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}

Это именно так, за исключением того, что он содержит 125 000 записей. Я могу читать в текстовом файле с помощью read(), но он создает переменную буквального текста файла, даже когда я инициализирую переменную с помощью

Дикт = {}

6 17

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