Как разделить два хэша для желаемого вывода в Python

#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-адресов, но как добавить это в мой текущий код?