фильтрация повторяющихся словарных конструкций
Задача такая: существует постоянный обмен письмами в шапке письма встречаются такие слова как "Срочно" "Очень Срочно", при попытке вытащить из шапки это слово что бы создать файл возникает повторение, а конкретно мой цикл реагирует в случае "Сверх Срочно" на обе конструкции и выводит в файле с метаданными письма и один и второй результат
цикл поиска
name: str = input ("Введите имя входящего файла: ")
f = open (name, "r") # открываем файл
lines = f.readlines () # читаем его построчно
for line in lines:
if line.find ('Срочно') != -1: # то что ищем
t9 = line [7:40] # определяет глубину
print (t9) # выводим на экран проверяем
break
# --------
for line in lines:
if line.find ('Сверх Срочно') != -1: # то что ищем
t10 = line [7:40] # определяет глубину
print (t10) # выводим на экран проверяем
break
вывод в файл
name1: str = input ("Введите имя исходящего файла: ")
f = open (name1, "w+")
if 't9' in globals (): # 't9' in locals()
f.write ('\n//Пометка принадлежности// ' + 'Срочно')
if 't10' in globals (): # 't10' in locals()
f.write ('\n//Пометка принадлежности// ' + 'Сверх срочно')
f.close ()
Исходя из этой проблемы и появляется вопрос, как правильно искать такие словарные конструкции с повторяющимся "корнем"?
Ответы (2 шт):
Сначала проверьте более специфичный случай, а потом менее специфичный, используя конструкцию if/elif:
if 't10' in globals (): # 't10' in locals()
f.write ('\n//Пометка принадлежности// ' + 'Сверх срочно')
elif 't9' in globals (): # 't9' in locals()
f.write ('\n//Пометка принадлежности// ' + 'Срочно')
Второй if проверится только в том случае, если не сработает первый.
Сам поиск можно тоже сделать аналогичным образом, два цикла там не нужны, можно сделать обе проверки в одном цикле аналогично тому коду, который я выше привёл.
Я бы ушел от конструкции if/else к использованию списка с ключами "Срочно", "Сверх срочно" или, если нужно как-то потом обрабатывать, словарю с ключем в виде типа срочности и значением к нему в виде функции обработки. Потом список сортируем по убыванию длинным строки. И ищем включения в итерируемые строки текста.
В принципе все можно в один блок загнать, чем разделять на два кода. Открываем два файла. Один читаем, второй пишем. Итерируем текст строку за строкой, ищем в ней ключевые слова.
funcs = ['Срочно', 'Сверх срочно', ]
name_r = 'file_1.txt'
name_w = 'file_2.txt'
with open(name_r, "r") as file_1, open(name_w, "w+") as file_2:
for line in file_1:
for f in sorted(funcs, key=len, reverse=True): # Сортируем в виде ['Сверх срочно', 'Срочно', ]
if f in line:
text = line[7:40] # определяет глубину
print(text) # выводим на экран проверяем
file_2.write (f'\n//Пометка принадлежности// {f}')