Python: создание словаря из текста / файла в формате словаря - PullRequest
20 голосов
/ 16 февраля 2012

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

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

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

dict = {}

Ответы [ 6 ]

28 голосов
/ 16 февраля 2012

Вы можете использовать встроенный 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 вызывает исключение.

3 голосов
/ 16 февраля 2012

Использование eval может быть опасным.Если json не работает, то я бы порекомендовал использовать yaml , который, кажется, хорошо работает с вашим примером ввода:

>>> import yaml
>>> yaml.load("{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}")
{'fawn': [1], 'scheuring': [2], 'sermersheim': [3], 'sonji': [2]}
2 голосов
/ 19 февраля 2017

Это не готовое к работе решение, которое может плохо работать с файлом вашего размера, но если вам нужен простой способ и вы можете добавить к файлу

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

, вы можете переименовать его вPython файл и просто импортировать

from my_file import my_dict 
2 голосов
/ 16 февраля 2012

Используйте функцию eval .

Например,

dict = eval(open("yourfile.txt").read())
1 голос
/ 16 февраля 2012

Я настоятельно не рекомендую использовать eval.Это может привести к проблемам с безопасностью, если у вас нет полного контроля над входным файлом.Просто импортируйте ваш словарь и сохраните его, используя модуль json или pickle.

0 голосов
/ 16 февраля 2012

Это выглядит как JSON для меня. Используйте модуль json, если это так.

Это похоже на меня. Используйте модуль pyyaml ​​, если это так. (По предложению @jcollado).

Вы не можете использовать модуль json, потому что он строг в своем вводе.

...