将文本文件读入if语句的Python解决方案

将文本文件读入if语句的Python解决方案,python,Python,我是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.

我是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)

行以位置开始,位置本身可以包含空格。这样一个简单的
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)
演示:

其中,
None
仍然在任意宽度的空格上拆分,并从结尾处去除换行符,但
4
将拆分限制为4个分隔符,使纽约保持不变

或者,作为一个有一些小改进的完整方法:

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

OP-可能需要考虑文本文件中的分隔符。<代码>位置VLAN网络+ CIDR子网掩码字面上类似于行中的吗?是的,文件看起来完全一样,只是一组喜欢的那种类型的数据。
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