Отфильтровать строки при наличии в них слова
Есть файл с таким содержанием:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
...
Есть такой код
SRC = 'mails.txt' # Исходный файл
OUT = 'result.txt' # Отфильтрованный
FILTR = ('@gmail.com',)
def grep_mail_names(src_list, filtr):
"""Возвратит массив имён, содержащих что-либо из filtr"""
result = [] # Строки удобнее и быстрее собирать в list
for line in src_list:
line = line.strip()
if not line:
continue
for d in filtr:
if d not in line:
break
else:
result.append(line)
return result
if __name__ == '__main__':
with open(SRC, 'r') as src_file:
file_1 = grep_mail_names(src_file.readlines(), FILTR)
with open(OUT, 'w') as out_file:
out_file.write('\n'.join(file_1))
В FILTR записываются домены строк, которые нужно оставить и записать в result.txt, но если добавить туда еще какой-нибудь домен, то все ломается. Туплю сильно, никак не могу исправить, что не так?
Ответы (2 шт):
Автор решения: nomnoms12
Вам же нужно добавить значение, если оно содержит хотя бы одну подстроку:
→ Ссылка
У Вас неправильная реализация фильтрации:
for d in filtr:
if d not in line:
break
else:
result.append(line)
Ветка else связана с циклом for и будет выполнена, только если цикл завершится без использования break.
То есть значение добавляется в список, если содержит каждую подстроку из FILTR.
Вам же нужно добавить значение, если оно содержит хотя бы одну подстроку:
for d in filtr:
if d in line:
result.append(line)
break
Автор решения: asd192
→ Ссылка
def grep_mail_names(src_list, filtr):
result = []
for line in src_list:
line = line.strip()
if line[line.index('@'):] in filtr:
result.append(line)
return result