#python #file #hash #split #hyphen
Вопрос:
Для начала мне нужен список всех уникальных IP-адресов в этом файле.
вот часть файла, который я читаю на python:
[node1] — 190.223.252.106 — Успешный вход Пользователя
[node2] — 239.84.157.20 — Успешная Загрузка изображения профиля Пользователя
[node2] — 87.130.185.37 — Успешный вход Пользователя
[node6] — 210.155.211.219 — Успешная оплата Пользователем
[node5] — 64.103.198.103 — Успешный вход Пользователя
Мой Код:
def UniqueIP(fileparm): counter = 0 input_file = open(fileparm, 'r') file_contents = input_file.read() input_file.close() ip_list = file_contents.split() unique_ip = set(ip_list) for ip in unique_ip: counter = 1 print(str(counter) ': ' str(ip) "n")
У меня хорошее начало, но мой результат выглядит так, как показано ниже. Я получаю в основном IP-адреса, но иногда и случайные фрагменты остального содержимого. Я просто хочу иметь возможность разделить » — » и использовать IP-адреса только в качестве выходных данных.
29: 191.219.189.162
30: [node3]
31: 21.147.6.59
32: 55.160.104.8
Ответ №1:
Вам нужно повторить каждую строку:
unique_ips = set() with open("path/to/file", "r", encoding="utf-8") as file: for line in file: line_parts = line.split("-", maxsplit=2) if len(line_parts) gt; 2: ip = line_parts[1] # Maybe you'd want to check if it's an IP here # if is_ip(ip): unique_ips.add(ip)
затем вы можете выполнить итерацию по набору
for index, ip in enumerate(unique_ips): print(f"{index 1}: {ip}")
Прежде чем добавлять IP — адрес в набор, я бы также подтвердил, что это на самом деле IP-адрес-что он содержит ровно 4 байта (от 0 до 255), разделенных точкой:
def is_ip(some_str): try: bvalues = list(map(int, some_str.split("."))) except ValueError: # Some of the stuff couldn't be parsed into int return False return all(0lt;=vallt;=255 for val in bvalues) and len(bvalues) == 4
(просто не забудьте объявить эту функцию перед остальной частью кода)
Комментарии:
1. Почему unique_ips не определен?
2. Потому что я этого не заявлял. Я использовал ваш код в качестве отправной точки и заполнил то, чего не хватает. Просто объявите его пустым
set()
перед использованием, и все должно быть в порядке. И на этом этапе, если вы объявляетеis_ip
функцию, вам нужно выяснить, где ее правильно использовать, если вы собираетесь ее использовать.3. Ах, хорошо, да, это работает, спасибо за вашу помощь! Плюс дополнительная проверка IP-адресов.
Ответ №2:
Если строки всегда одинаковы, с -
до и после IP-адреса, в этой позиции, то вы можете использовать split
с определенным символом, выбрать соответствующий элемент, а затем strip
удалить лишние пробелы
x = "node1] - 190.223.252.106 - User Successful Login" x.split('-')[1].strip() # 190.223.252.106
Однако, если есть больше вариантов, возможно, вам будет лучше использовать регулярное выражение для конкретного соответствия IP-адресу.
Комментарии:
1. Да, всегда есть «-» до/после IP-адресов, но как добавить это в мой текущий код?