Как на Python написать скрипт для очистки текстовых логов от дублирующихся URL-адресов, сохраняя порядок их появления?

Для очистки текстовых логов от дублирующихся URL-адресов с сохранением порядка их первого появления в Python удобно использовать комбинацию регулярных выражений и структуры данных `dict` (или `set`), которые в Python 3.7+ сохраняют порядок вставки.

**Полный скрипт:**

python
import re

def extract_unique_urls(log_file_path: str, output_file_path: str) -> list:
url_pattern = re.compile(
r’https?://[^s»‘>]+’
)
seen = dict() # dict сохраняет порядок вставки

with open(log_file_path, ‘r’, encoding=’utf-8′) as f:
for line in f:
matches = url_pattern.findall(line)
for url in matches:
url = url.rstrip(‘.,;)’) # убираем случайные символы в конце
if url not in seen:
seen[url] = True

unique_urls = list(seen.keys())

with open(output_file_path, ‘w’, encoding=’utf-8′) as out:
for url in unique_urls:
out.write(url + ‘n’)

return unique_urls

if __name__ == ‘__main__’:
result = extract_unique_urls(‘access.log’, ‘unique_urls.txt’)
print(f’Найдено уникальных URL: {len(result)}’)
for url in result[:10]:
print(url)

**Как это работает:**

1. **Регулярное выражение** `https?://[^s»‘>]+` находит все HTTP и HTTPS URL в каждой строке лога.
2. **`dict` вместо `set`** — используется для хранения уже встреченных URL. В Python 3.7+ словари гарантированно сохраняют порядок добавления элементов.
3. **`rstrip`** убирает случайно захваченные знаки препинания в конце URL (точки, запятые, скобки).
4. Результат записывается в выходной файл — по одному URL на строку.

**Дополнительные улучшения:**

— Можно нормализовать URL перед сравнением (привести к нижнему регистру, убрать trailing slash) с помощью `urllib.parse`.
— Для очень больших логов (гигабайты) скрипт уже оптимален, так как читает файл построчно, не загружая его целиком в память.
— Можно добавить счётчик дублей для аналитики.

**Строка для CSV:**

log_file_path,output_file_path,unique_url_count,first_10_urls


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.