#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, чтобы поместить несколько входных данных в окончательный список.