Функция читает огромный файл целиком и создаёт несколько копий; проверка наличия @ не распознаёт email. Для экономии памяти обрабатывайте строки по одной и отдавайте найденные кандидаты итератором.
def extract_emails_from_huge_file(file_path: str) -> list[str]:
Функция читает огромный файл целиком и создаёт несколько копий; проверка наличия @ не распознаёт email. Для экономии памяти обрабатывайте строки по одной и отдавайте найденные кандидаты итератором.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def extract_emails_from_huge_file(file_path: str) -> list[str]: with open(file_path, 'r', encoding='utf-8') as f: content = f.read()
# Заменяем переносы строк, чтобы текст был "сплошным"
content = content.replace('\r\n', ' ').replace('\n', ' ')
lines = content.split(' ')
emails = [word for word in lines if '@' in word]
return emails
Ответ
Функция читает огромный файл целиком и создаёт несколько копий; проверка наличия @ не распознаёт email. Для экономии памяти обрабатывайте строки по одной и отдавайте найденные кандидаты итератором.
Пример упрощённого извлечения кандидатов:
import re
PATTERN = re.compile(r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}')
def iter_email_candidates(path):
with open(path, encoding='utf-8') as stream:
for line in stream:
for match in PATTERN.finditer(line):
yield match.group()
Это не полный RFC-валидатор: международные адреса и сложные формы требуют отдельной политики. Память ограничена максимальной строкой; для гигантских строк нужен chunk-parser с переносом хвоста. Если контракт требует list, память под весь результат всё равно потребуется.