我正在进行一个项目来搜索一个IP地址,看看它是否在日志文件中。我取得了一些很好的进展,但在处理日志文件格式的某些项搜索时,我陷入了困境。
以下是我所拥有的:
IP = raw_input('Enter IP Address:')
with open ('RoutingTable.txt', 'r') as searchIP:
for line in searchIP:
if IP in line:
ipArray = line.split()
print ipArray
if IP == ipArray[0]:
print "Success"
else:
print "Fail"正如您所看到的,这是非常糟糕的代码,但我对Python和编程还不熟悉,所以我使用它来确保至少可以打开文件,并将输入的第一项与字符串进行比较。
她是一个示例文件内容(我的实际文件有数千个条目):
我想要一种将所有IP (只是IP而不是其他垃圾)存储在数组中的方法,然后用一个循环来遍历数组中的所有项目,并与用户定义的IP进行比较。
例如,对于这一行,所有关心的是10.20.70.0/23
D EX 10.20.70.0/23 [170/3072] via 10.10.10.2, 6d06h, Vlan111
[170/3072] via 10.10.10.2, 6d06h, Vlan111
[170/3072] via 10.10.10.2, 6d06h, Vlan111
[170/3072] via 10.10.10.2, 6d06h, Vlan111请帮帮忙。
谢谢达蒙
编辑:我正在挖掘设置标志,但这只在某些情况下有效,因为您可以看到,所有行都不是以D开头,但也有一些以O(用于OSFP路由)和C(直接连接)开始。
下面是我正在做的事情:
f = open("RoutingTable.txt")
Pr = False
for line in f.readlines():
if Pr: print line
if "EX" in line:
Pr = True
print line
if "[" in line:
Pr = False
f.close()这给了我一个更清晰的结果,但仍然是整条线,而不仅仅是IP。
发布于 2017-04-13 23:34:54
你一定要自己储存所有的IP吗?您可以执行以下操作,获取列表中的所有数据,并检查输入字符串是否驻留在列表中:
your_file = 'RoutingTable.txt'
IP = input('Enter IP Address:')
with open(your_file, 'r') as f:
data = f.readlines()
for d in data:
if IP in d:
print 'success'
break
else:
print 'fail'else语句只在不使用break时触发,即没有成功案例。
如果您不能将所有内容读入内存中,您可以像在您的帖子中所做的那样遍历每一行,但是应该可以轻松地完成数千行。
编辑
import re
your_file = 'RoutingTable.txt'
ip_addresses = []
IP = input('Enter IP Address:')
with open(your_file, 'r') as f:
data = f.readlines()
for d in data:
res = re.search('(\d+\.\d+\.\d+\.\d+\/\d+)', d)
if res:
ip_addresses.append(res.group(1))
for ip_addy in ip_addresses:
if IP == ip_addy:
print 'success'
break
else:
print 'fail'
print ip_addresses发布于 2017-04-13 23:39:21
首先,我想提到您处理文件打开和关闭的最初方法(您使用了上下文管理器,"with (.)“(部分)更好。它更干净,防止你忘记再次关闭它。
第二,我会亲自用正则表达式来处理这个问题。如果您知道您将得到相同的模式,首先是D、EX或O等,然后是地址,然后是括号内的部分,那么正则表达式就不会有多大作用,它们绝对值得理解。
这是了解它们的一个很好的资源:http://regular-expressions.mobi/index.html?wlr=1
不同的语言有不同的解释方式。下面是python特性的链接(请记住导入re):https://docs.python.org/3/howto/regex.html
还有一个名为regexr的网站(我没有足够的声誉来链接另一个链接),您可以使用它来处理表达式,从而掌握它。
总之,我会亲自保留打开文件的初始上下文管理器,然后使用编辑中的readline方法,在其中使用正则表达式从行中提取地址,并将得到的地址放入列表中。
https://stackoverflow.com/questions/43402647
复制相似问题