Как на 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
