Я боролся в течение нескольких дней с правильным способом решения этого решения, и я ищу некоторую помощь.
У меня есть два файла, и мне нужно создать третий, который показывает взаимосвязь.
- Файл IP-адреса — ip.csv
- Файл подсети — subnet.csv
Мне нужно указать, в какой подсети находится каждый IP, и создать третий файл
Файл ip.csv будет содержать около 1,5 миллиона IP-адресов, а файл subnet.csv — около 140 000 подсетей.
Образец файла ip.csv:
IP,Type
10.78.175.167,IPv4
10.20.3.56,IPv4
Образец файла subnet.csv:
Subnet,Netmask
10.176.122.136/30,255.255.255.252
10.20.3.0/24,255.255.254.0
Формат файла, который мне нужно создать:
Subnet,IP
10.20.3.0/24,10.20.3.56
Я попытался использовать вещи с этих страниц:
Это код, который я пробовал. Он работает с небольшими наборами, но у меня возникают проблемы с его запуском с полным набором файлов.
#!/usr/local/bin/python2.7
import csv
import ipaddress
import iptools
import re
import SubnetTree
import sys
from socket import inet_aton
testdir = '/home/test/testdir/'
iprelfile = testdir + 'relationship.csv'
testipsub = testdir + 'subnet.csv'
testipaddr = testdir + 'ip.csv'
o1 = open (iprelfile, "a")
# Subnet file
IPR = set()
o1.write('Subnet,IP\n')
with open(testipsub, 'rb') as master:
reader = csv.reader(master)
for row in reader:
if 'Subnet' not in row[0]:
# Convert string to unicode to be parsed with ipaddress module
b = unicode(row[1])
# Using ipaddress module to create list containing every IP in subnet
n2 = ipaddress.ip_network(b)
b1 = (list(n2.hosts()))
# IP address file
with open(testipaddr, 'rb') as ipaddy:
readera = csv.reader(ipaddy)
for rowa in readera:
if 'IP' not in rowa[0]:
bb = rowa[0]
for ij in b1:
# Convert to string for comparison
f = str(ij)
# If the IP address is in subnet range
if f == bb:
IPR.update([row[0] + ',' + bb + '\n'])
for ip in IPR:
o1.write(ip + '\n')
# Closing the file
o1.close()