Check

Подсчёт запросов по endpoint в логе

Python Middle Яндекс 01.01.2025
Дан файл access.log, в котором каждая строка имеет формат: ```text <ip> - - [<date>] "GET /api/v1/users HTTP/1.1" 200 123 ``` Нужно написать функцию `count_endpoints(path: str) -> list[tuple[str, int]]`, которая: 1. Принимает путь к файлу. 2. Считывает файл построчно. 3. Извлекает путь (например `/api/v1/users`). 4. Подсчитывает, сколько раз каждый путь встречался. 5. Возвращает **список из трёх самых популярных endpoint'ов** в формате: ```python [("/api/v1/users", 150), ("/api/v1/orders", 120), ("/health", 80)] ``` Если уникальных endpoint'ов меньше трёх — вернуть все. Файл может быть большим, нужно читать его построчно, а не целиком в память.
Ответы
Решение 1
```python from collections import Counter from typing import List, Tuple def count_endpoints(path: str) -> List[Tuple[str, int]]: counter: Counter[str] = Counter() with open(path, "r", encoding="utf-8") as f: for line in f: # Простейший парсинг по кавычкам parts = line.split('"') if len(parts) < 2: continue request = parts[1] # например: GET /api/v1/users HTTP/1.1 req_parts = request.split() if len(req_parts) < 2: continue endpoint = req_parts[1] counter[endpoint] += 1 return counter.most_common(3) ```