如何解决比较2个文件的文本和比较的问题

时间:2017-10-09 18:28:18

标签: python python-2.7 diff

我有一个脚本可以从设备管理器“Master-EDR-List.txt”获取分发交换机列表。然后它从另一台服务器“New-EDR-List.txt”中获取另一个txt文件。主列表是非常静态的,直到新列表具有缺少主列表的其他EDR。

我想比较这两个文件并保存新列表中但不在主列表中的任何EDR。我写了一个比较脚本,但它不可靠。我在新列表中添加了一些额外的测试EDR,并根据我将它们放在列表中的位置得到意外结果。我总是得到新的,但有时我也会得到两个列表中的EDR,有时我会在同一行中得到两个新的EDR而没有空格。

这是我的代码:

    old_lines = set((line.strip() for line in open('Master-EDR-List.txt', 'r+')))
    file_new = open('New-EDR-List.txt', 'r+')
    #file_diff = open('file_diff.txt', 'w')

    #Open Master File
    with open('Master-EDR-List.txt', 'r') as f:
        d = set(f.readlines())

    #Open New File
    with open('New-EDR-List.txt', 'r') as f:
        e = set(f.readlines())

    #Open Diff files to store differences
    open('file_diff.txt','w').close()

    with open('file_diff.txt', 'a') as f:
        for line in list(e - d):
            f.write(line)

以下是我用于测试的列表:

主列表:

rts41d-an28edr1.rt.tst.com
rts41d-an28edr2.rt.tst.com
rts41d-an32edr1.rt.tst.com
rts41d-an32edr2.rt.tst.com
rts41d-as19edr1.rt.tst.com
rts41d-as19edr2.rt.tst.com
rts41d-as21edr1.rt.tst.com
rts41d-as21edr2.rt.tst.com
rts12a-ah46edr2.rt.tst.com
rts12a-al46edr2.rt.tst.com
rts12a-as46edr1.rt.tst.com
rts12a-as46edr2.rt.tst.com
rts12a-as46edr2.rt.tst.com
rts12a-aw46edr1.rt.tst.com
rts12a-aw46edr2.rt.tst.com
rts12a-aw46edr2.rt.tst.com
rts12b-as46edr1.rt.tst.com
rts12b-ax46edr1.rt.tst.com

新名单:

rts41d-an28edr1.rt.tst.com
rts41d-an28edr2.rt.tst.com
rts41d-an32edr1.rt.tst.com
rts41d-an32edr2.rt.tst.com
rts41d-as19edr1.rt.tst.com
rts41d-as19edr2.rt.tst.com
rt511-sps5.rt.tst.com
rts41d-as21edr1.rt.tst.com
rts41d-as21edr2.rt.tst.com
rts12a-ah46edr2.rt.tst.com
rts12a-al46edr2.rt.tst.com
rts12a-as46edr1.rt.tst.com
rts12a-as46edr2.rt.tst.com
rt511-sps6.rt.tst.com
rts12a-as46edr2.rt.tst.com
rts12a-aw46edr1.rt.tst.com
rts12a-aw46edr2.rt.tst.com
rts12a-aw46edr2.rt.tst.com
rts12b-as46edr1.rt.tst.com
rts12b-ax46edr1.rt.tst.com
rt511-sps7.rt.tst.com

我在列表中添加了2个测试rt511-sps5,6和7,而不是仅获取这3个项目,我在我的Diff文件中得到了这个:

差异文件:

rt511-sps7.rt.tst.comrt511-sps5.rt.tst.com
rt511-sps6.rt.tst.com
rts12b-ax46edr1.rt.tst.com

如您所见,sps7和5由于某种原因在同一行中,并且“rts12b-ax46edr1”不应该存在,因为它已经存在于两个文件中。

有谁知道为什么会发生这种情况以及如何解决这个问题?新列表可以发现任何新的分配开关,并根据其名称将其放在列表中的任何位置。我希望这个脚本只打印出Master没有的任何新EDR。

由于

1 个答案:

答案 0 :(得分:0)

我修改了你的脚本。请使用以下代码满足您的要求。不要忘记关闭所有打开的文件。

with open('Master-EDR-List.txt', 'r') as f:
 d = f.readlines()
#Open New File
with open('New-EDR-List.txt', 'r') as f:
 e = f.readlines()
out = open('file_diff.txt', 'a')

for newline in e:
 found = False
 for oldline in d:
  if((newline.strip(' \t\n\r')) == (oldline.strip(' \t\n\r'))):
   found = True
   break;
 if(found == False):
  if(newline != '\n'):
   out.writelines(newline)