2017-10-09 112 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的我已經修改了代碼,現在它應該按照您的要求工作名稱。請讓我知道如果你需要更多的幫助。 –