Как читать словарь из текстового файла? - PullRequest
2 голосов
/ 24 апреля 2019

У меня есть текстовый файл в следующем формате

d = {'EMS':1,'ESC': 2, 'HVAC': 3,'IC' : 4,'ICU' : 5,'IS' : 6,'ITM' : 7,'MBFM' : 8,'PKE' : 9,'RPAS' : 10,'RVC' : 11,'SAS' : 12,'SRS' : 13,'TCU' : 14,'TPMS' : 15,'VCU' : 16,'BMS' : 17,'MCU' :18,'OBC' :19}

Как прочитать словарь, чтобы найти значение определенного значения?

Я пробовал приведенный ниже код

with open(r"filename","r") as f:
    data = ast.literal_eval(f.read())
    print(data)
    for age in data.values():
        if age == search_age:
            name = data[age]
            print (name)

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Ваш текстовый файл является допустимым кодом Python, поэтому, если он из надежного источника, вы можете просто сделать:

with open("filename") as f:
    exec(f.read())

и переменная d будет загружена с помощью dict.

Если текстовый файл не из надежного источника, однако, вы можете использовать ast.parse для разбора кода, а затем ast.walk для обхода абстрактного синтаксического дерева и поиска узла Dict. Из соображений безопасности убедитесь, что узел dict не содержит ни одного узла Call, прежде чем обернуть его как тело узла Expression и скомпилировать его для eval, чтобы превратить его в настоящий dict, хранящийся в переменной d:

import ast
with open("filename") as f:
    for node in ast.walk(ast.parse(f.read())):
        if isinstance(node, ast.Dict) and \
                not any(isinstance(child, ast.Call) for child in ast.walk(node)):
            d = eval(compile(ast.Expression(body=node), '', 'eval'))
            break
    else:
        print('No valid dict found.')

Учитывая ваш пример ввода, d станет:

{'EMS': 1, 'ESC': 2, 'HVAC': 3, 'IC': 4, 'ICU': 5, 'IS': 6, 'ITM': 7, 'MBFM': 8, 'PKE': 9, 'RPAS': 10, 'RVC': 11, 'SAS': 12, 'SRS': 13, 'TCU': 14, 'TPMS': 15, 'VCU': 16, 'BMS': 17, 'MCU': 18, 'OBC': 19}
0 голосов
/ 24 апреля 2019

Вам нужно перебрать и ключи, и значения:

with open('filename') as f:
    data = ast.literal_eval(f.read())
    print(data)
    for name, age in data.items():
        if age == search_age:
            print(name)

Кроме того, этот файл выглядит как допустимый объект JSON, поэтому вам, вероятно, следует использовать json.load over ast.literal_eval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...