2017-10-09 87 views
0

我有一个脚本从设备管理器“Master-EDR-List.txt”获取分配开关列表。然后它从另一个服务器“New-EDR-List.txt”获取另一个txt文件。主列表非常静态,直到新列表中有主列表丢失的额外EDR。如何解决比较2个文件的文本和比较的问题

我想比较这两个文件,并保存任何在新列表但不在主列表中的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。

谢谢

回答

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) 
+0

它确实修复了第一行并将它们添加到单独的文件中,但我仍然看到相同的输出。 rts12b-ax46edr1.rt.tst.com仍然在列表中,即使它存在于两个文件中。我不知道为什么它这样做。 – Neo

+0

我想我找到了问题。我调试循环,走到通所有的迭代,直到我到达最后一个。这是它在做什么。 NEWLINE =“rts12b-ax46edr1.rt.tst.com \ n”,而old_line =‘rts12b-ax46edr1.rt.tst.com’。由于对主文件,它是最后一个项目,它没有‘\ n’的结束。反正我可以删除“\ n”表示在比较中使用,而是只使用? – Neo

+0

@ neo的我已经修改了代码,现在它应该按照您的要求工作名称。请让我知道如果你需要更多的帮助。 –