#python #python-3.x #dictionary #text
#python #python-3.x #словарь #текст
Вопрос:
У меня есть текстовый файл в приведенном ниже формате
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)
Комментарии:
1. Итак, что не так с кодом?
2. @Tejesh Reddy удалите
d =
из файла. Скорее всего, это проблема3. Это допустимый модуль Python. Переименуйте его в
filename.py
и затемfrom filename import d
. Вот и все, теперь у вас есть ваш словарь.
Ответ №1:
Ваш текстовый файл является допустимым кодом 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}
Ответ №2:
Вам нужно выполнить итерацию как по ключам, так и по значениям:
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
.
Комментарии:
1. я попробовал это, я получил файл «C:Python37-32libast.py «, строка 46, в файле literal_eval node_or_string = parse(node_or_string, mode=’eval’) «C:Python37-32libast.py «, строка 35, в синтаксическом анализе возвращается компиляция (исходный файл, имя файла, режим, PyCF_ONLY_AST) «<неизвестно>», строка 1 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} ^ Ошибка синтаксиса: недопустимый синтаксис
2. @TejeshReddy Сам ваш файл имеет неправильную форму. Извлеките
d =
.