Заменить сетевой адрес адресом хоста в python

#python #function #ip-address

#python #функция #ip-адрес

Вопрос:

У меня есть файл с IP-адресом в этом формате

192.168.1.9

192.168.1.10

192.168.1.8

который я прочитал в списке, подобном этому

 with open("file.txt") as f:
    ipaddr = f.read().splitlines()
  

А затем запустите некоторые функции дальше.

Однако я также мог бы указать сетевой адрес в этом документе, как в 192.168.0.0 / 25, и каким-то образом перевести их в списке как

192.168.0.1

192.168.0.2

192.168.0.3

Я даже понятия не имею, как это сделать? (работает на Python 2.6)

Комментарии:

1. Попробуйте netaddr библиотеку: pythonhosted.org/netaddr . Существуют также альтернативы этому.

Ответ №1:

netaddr Это один из лучших способов сделать это:

 import netaddr

with open('file.txt') as f:
    for line in f:
        try:
            ip_network = netaddr.IPNetwork(line.strip())
        except netaddr.AddrFormatError:
            # Not an IP address or subnet!
            continue
        else:
            for ip_addr in ip_network:
                print ip_addr
  

Для примера файла:

 10.0.0.1
192.168.0.230
192.168.1.0/29
  

Результат, который она выдает, является:

 10.0.0.1
192.168.0.230
192.168.1.0
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
  

Ответ №2:

Вам нужно проанализировать ваш текстовый файл с помощью регулярного выражения. Найдите модуль ‘re’ в Python. Быстрая реализация этой идеи заключается:

 import re
with open("ips.txt") as f:
    ip_raw_list = f.read().splitlines()

#Only takes the string after the '/'
reg_ex_1 = r'(?<=/)[0-9]*'
#Only take the first three numbers "0.0.0" of the IP address
reg_ex_2 = r'.*..*..*.' 
ip_final_list = list()

for ip_raw in ip_raw_list:

    appendix = re.findall(reg_ex_1, ip_raw)

    #Ip with no backslash create on input
    if not appendix:
        ip_final_list.append(ip_raw)

    #Ip with backslash create several inputs

    else:

        for i in range(int(appendix[0])):
            ip_final_list.append(re.findall(reg_ex_2, ip_raw)[0]   str(i))
  

Этот код использует возможности регулярного выражения для отделения IP-адресов формы ‘0.0.0.0’ от IP-адресов формы ‘0.0.0.0/00’. Затем для IP-адресов первой формы вы помещаете IP-адрес непосредственно в окончательный список. Для IP-адресов второго for вы запускаете цикл for, чтобы поместить несколько входных данных в окончательный список.