我是Python的新手,我正在尝试解析一些网络数据,以确定某个IP地址基于它所在城市的位置。我在下面的代码中有以下代码。但我有几百行信息,我希望我的脚本可以通过,并为每个信息创建一个特定的if / else语句似乎效率不高。
from netaddr import *
def locateip(ipaddr):
if IPAddress(ipaddr) in IPNetwork('10.10.10.0/24'):
return 'New York', '10', '10.10.10.0', '10.10.10.0/24', '255.255.255.0'
elif IPAddress(ipaddr) in IPNetwork('10.10.20.0/24'):
return 'Chicago', '20', '10.10.20.0', '10.10.20.0/24', '255.255.255.0'
elif IPAddress(ipaddr) in IPNetwork('10.10.20.0/24'):
return 'Dallas', '30', '10.10.30.0', '10.10.30.0/24', '255.255.255.0'
ipaddrsource = raw_input('Source Ip Address:')
try:
srclocation, srcvlan, srcnetwork, srcnetworkcidr, srcsubnetmask = locateip(ipaddrsource)
except Exception, e:
print e
print 'Location: ' + str(srclocation)
print 'Vlan: ' + str(srcvlan)
print 'Network: ' + str(srcnetwork)
print 'Network/CIDR: ' + str(srcnetworkcidr)
print 'Subnet Mask: ' + str(srcsubnetmask)
我的所有数据都被格式化为类似于下面列出的文本文件。
location vlan network network+cidr subnetmask
New York 10 10.10.10.0 10.10.10.0/24 255.255.255.0
Chicago 20 10.10.20.0 10.10.20.0/24 255.255.255.0
Dallas 30 10.10.30.0 10.10.30.0/24 255.255.255.0
我一直试图让以下内容工作,但我无法弄清楚如何将文本文件中的一行发送到if语句中以返回其余的元数据。任何帮助都会很棒!
from netaddr import *
def locateip(ipaddr):
f = open('networkinfo.txt','r')
for line in f:
networkdata = line.split()
if IPAddress(ipaddr) in IPNetwork(networkdata[3]):
return networkdata[0], networkdata[1], networkdata[2], networkdata[3], networkdata[4]
ipaddrsource = raw_input('Source Ip Address:')
try:
srclocation, srcvlan, srcnetwork, srcnetworkcidr, srcsubnetmask = locateip(ipaddrsource)
except Exception, e:
print e
print 'Location: ' + str(srclocation)
print 'Vlan: ' + str(srcvlan)
print 'Network: ' + str(srcnetwork)
print 'Network/CIDR: ' + str(srcnetworkcidr)
print 'Subnet Mask: ' + str(srcsubnetmask)
答案 0 :(得分:4)
您的行以一个位置开头,该位置本身可以包含空格。这样一个直截了当的str.split()
不会起作用:
>>> 'New York 10 10.10.10.0 10.10.10.0/24 255.255.255.0\n'.split()
['New', 'York', '10', '10.10.10.0', '10.10.10.0/24', '255.255.255.0']
请注意New
和York
在这里是两个单独的条目,使networkdata[3]
输入错误。
您需要从末尾拆分,并限制拆分次数:
networkdata = line.rsplit(None, 4)
演示:
>>> 'New York 10 10.10.10.0 10.10.10.0/24 255.255.255.0\n'.rsplit(None, 4)
['New York', '10', '10.10.10.0', '10.10.10.0/24', '255.255.255.0']
其中None
仍然在任意宽度的空格上拆分并从最后删除换行符,但4
限制拆分为4个分隔符,使New York
保持不变。
或者,作为一个有一些小改进的完整方法:
def locateip(ipaddr):
ipaddr = IPAddress(ipaddress)
with open('networkinfo.txt') as f:
next(f, None) # skip the header line first
for line in f:
location, vlan, net, netcdr, mask = line.rsplit(None, 4)
if ipaddr in IPNetwork(netcdr):
return location, vlan, net, netcdr, mask
可能是您的输入格式实际上是使用制表符:
New York\t10\t10.10.10.0\t10.10.10.0/24\t255.255.255.0
在这种情况下,您可能希望使用csv
模块读取格式:
import csv
def locateip(ipaddr):
ipaddr = IPAddress(ipaddress)
with open('networkinfo.txt') as f:
reader = csv.reader(f, delimiter='\t')
next(reader, None) # skip the header line first
for location, vlan, net, netcdr, mask in reader:
if ipaddr in IPNetwork(netcdr):
return location, vlan, net, netcdr, mask