Подтвердить что ты не робот

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

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

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

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

dict = {}

4b9b3361

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