如何比较具有相同信息但不按顺序排列的两个文本文件?

时间:2014-01-06 23:10:36

标签: python-2.7

前言:我是脚本/编程的新手,我将其作为一种有助于工作的学习工具。

我制作了一个小的python 2.7脚本来运行每日nmap ping扫描,以查看我的服务器是否已启动并运行。

该脚本运行正常,但由于服务器回复滞后,我的最终比较失败,最终使列表与基线列表不同以进行比较。

例如:

Baseline.txt具有以下信息

Host:10.0.1.2 status up
Host:10.0.1.3 status up
Host:10.0.1.4 status up
Host:10.0.1.5 status up

当脚本运行时,由于滞后而返回以下内容:

Host:10.0.1.5 status up
Host:10.0.1.2 status up
Host:10.0.1.4 status up
Host:10.0.1.3 status up

信息相同,但顺序不同,脚本会将两个文件视为不同,并报告发生了更改。 (我使用简单的if语句进行比较,这可能是我的问题)

有没有办法迭代文件的每一行,将它与基线文件的每一行进行比较,如果有信息,请将其读取为无变化?或者我完全错了吗?

以下是需要的代码:

import smtplib

#Method for emailing if a problem arises
def notify():

    SMTP_SERVER = 'smtp.gmail.com'
    SMTP_PORT = 587

    sender = 'SERVER_ALERT@company.com'
    recipient = 'me@me.com'
    subject = 'SERVER STATUS ALERT'
    body = 'Check all servers for an unscheduled change!'

    body = "" + body + ""

    headers = ["From: " + sender,
       "Subject: " + subject, 
       "To: " + recipient, 
       "MIME-Version: 1.0",
       "Content-Type: text/html"]
    headers = "\r\n".join(headers)

    session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
    session.ehlo()
    session.starttls()
    session.login('notify_me@me.com', 'password')

    session.sendmail(sender, recipient, headers + "\r\n\r\n" + body)
    session.quit()

#Scanning with nmap and naming the scan the date
timestr = time.strftime("%m-%d-%y")

daily_scan = open(timestr+".txt", 'w')

os.system("nmap -sn -iL ip_list.txt -oG scan.txt")

scan_data = open("scan.txt", 'r').readlines()

#Checking for changes
for line in scan_data:
    if "Host:" in line:
        daily_scan.write(str(line))

daily_scan.close()

os.system('rm scan.txt')

baseline = open('baseline.txt', 'r').readlines()

daily_check = open(timestr+".txt", 'r').readlines()

if baseline == daily_check:
    exit()
else:
    notify()

2 个答案:

答案 0 :(得分:1)

看起来如果用

替换最后一行
if sorted(baseline) == sorted(daily_check):
    exit()

你可以得到你想要的东西。

答案 1 :(得分:1)

>>> b = open('baseline.txt').readlines()
>>> r = open('return.txt').readlines()
>>> b == sorted(r)
True

要进行防御性编程,如果将来某些代码更改为baseline.txt未排序,我们可以改为使用此测试:

sorted(b) == sorted(r)

最后,您可能想要比简单的相等测试更有用的信息。考虑:

problems = [ line for line in r if line not in b ]
if problems:
    notify()
else:
    exit()

这将problems分配给基线的任何更改,换句话说,rb中的任何行也不会在r中显示为未更改。此代码不依赖于排序。如果问题中没有行,则计算结果为false并退出代码。如果notify中的任何行不同,则会调用problems。要提供更具信息性的输出,您可以将notify列表传递给{{1}}。