2016-03-13 78 views
2

我有兩個文件,我需要這兩個文件中不同的行。 這兩行文件中的行不符合要求。獲取兩個文件中的差異

我嘗試使用下面的腳本

file1 = open("test1.txt","r") 
file2 = open("test2.txt","r") 

lines1 = hosts0.readlines() 

for i,lines2 in enumerate(file2): 
    if lines2 != lines1[i]: 
     print ("line ", i, " in File2 is different \n") 
     print (lines2) 
    else: 
     print ("Its similar") 

然而,這僅在這兩個文件中相同的行號線進行比較。

我的文件示例:

File1:
User 1 is Sam and PC in VLAN Trust 
User10 is Tom and PC in VLAN Sales 
Harry is User 6 and in VLAN Fin 
File2:
Harry is User 6 and in VLAN Fin 
User 1 is Sam and PC in VLAN Trust 
User10 is Tom and PC in VLAN Sales 
User20 is Donald and VLAN is Trust 

我所要的輸出告訴我File1中缺少的線,有file2中。只要兩個文件之間的任何一行是常見的,而不考慮不同的行號,則不應將其列爲差異。

+0

這些文件有多大?如果它們很容易適應內存,則可以簡單地使用[sets](https://docs.python.org/2/library/sets.html):'diff = set(file1).symmetric_difference(set(file2)) '這不會保留關於行號的信息。 –

+0

嗨Lukas,這些文件大約是10 MB,您建議的命令列出了區別並且不知道哪個文件缺少這些行。但對我來說就足夠了,因爲只有一個文件在我的情況下缺少了幾行。感謝:-) – Zoro99

回答

1

它打開文件,讀取行。

然後,它會遍歷這些行並將file2中的每一行與file1中的行進行比較。如果該行同時存在,則變量inboth將變爲true。

我在最後添加了一個打印命令,所以我可以檢查它的工作原理。只需更改變量名稱以適合您使用的變量名稱,然後將其添加到當前程序中。希望這是一個幫助

f1 = open("file1.txt","r") 
f2 = open("file2.txt","r") 

lines1 = f1.readlines() 
lines2 = f2.readlines() 

for i in lines2: 
    inboth = False 
    for x in lines1: 
     if i == x: 
      inboth = True 
    if inboth != True: 
     print("The line: \n",i,"\nis in file 2 but not file 1\n") 
+0

簡單而有效的解決方案:-) – Zoro99

+0

很高興它爲你工作 – NicheQuiche

1
with open('file1.txt','r') as f: lines1=f.readlines() 
with open('file2.txt','r') as f: lines2=f.readlines() 
diff=False 
for line,idx in zip(lines2,range(len(lines2))): 
    if line not in lines1: 
     print("line %d of file2 is missing in file1:\n%s"%(idx,line)) 
     diff=True 
if not diff: 
    print("similar") 
1

你可以嘗試這樣的事情:

file1 = open("test1.txt","r") 
file2 = open("test2.txt","r") 

lines1 = file1.readlines() 
lines2 = file2.readlines() 

for i, line in enumerate(lines2): 
    if line not in lines1: 
     print("Line {} in file 2 is not in file 1".format(i)) 

for i, line in enumerate(lines1): 
    if line not in lines2: 
     print("Line {} in file 1 is not in file 2".format(i)) 

file1.close() 
file2.close() 

這適用於這兩個文件。行數從零開始。您可以通過在格式參數中編寫i+1來修復它。還請記住在腳本完成對它們的處理之後關閉文件。

1

最好的辦法是使用difflib這是Python中的一個內置模塊。下面是一個例子:

import difflib 

file1_lines = [ 
    'User 1 is Sam and PC in VLAN Trust', 
    'User10 is Tom and PC in VLAN Sales', 
    'Harry is User 6 and in VLAN Fin' 
] 

file2_lines = [ 
    'Harry is User 6 and in VLAN Fin', 
    'User 1 is Sam and PC in VLAN Trust', 
    'User10 is Tom and PC in VLAN Sales', 
    'User20 is Donald and VLAN is Trus' 
] 

differ = difflib.Differ() 
diffs = list(differ.compare(file1_lines, file2_lines)) 

for diff in diffs: 
    print(diff) 

輸出:

+ Harry is User 6 and in VLAN Fin 
    User 1 is Sam and PC in VLAN Trust 
    User10 is Tom and PC in VLAN Sales 
- Harry is User 6 and in VLAN Fin 
+ User20 is Donald and VLAN is Trus 

docs for Differ,這些初始的雙字母代碼的含義是:

  • '- ' line unique to sequence 1
  • '+ ' line unique to sequence 2
  • ' ' line common to both sequences
  • '? ' line not present in either input sequence

這裏 「序列1」 是第一個參數到differ.compare()和「序列2」是第二個,這兩個都是要比較的字符串列表。


我更容易的解釋:

  • '+ '開頭的行是那些file2_lines補充說,缺席在file1_lines'- '開始
  • 系是那些在file2_lines缺席,但在file1_lines
  • 在那裏
  • '? '開頭的行是那些變了(up to a certain threshold
  • 線,' '開始是那些沒有兩個組線

編輯

我看到在我的輸出線Harry is user...沒有證明是不變之間修改。如果我現在瞭解它的權利,你希望它顯示爲不變。您可以通過首先對字符串列表進行排序然後比較排序列表來解決此問題。撥打compare只需更改此行:

diffs = list(differ.compare(sorted(file1_lines), sorted(file2_lines))) 
+0

得到以下錯誤,它出現了一些問題,我的Python庫//文件「C:\ Python \ lib \ difflib.py」,第912行,在比較 cruncher = SequenceMatcher(self.linejunk,a,b) 文件「C:\ Python \ lib \ difflib.py」,行216,在__init__中 self.set_seqs(a,b) 文件「C:\蟒\ lib中\ difflib.py 「線路228,在set_seqs self.set_seq2(b) 文件 」C:\蟒\ lib中\ difflib.py「,線路282,在set_seq2 自.__ chain_b() 文件」 C:\ Python33 \ lib \ difflib.py「,第330行,在__chain_b中 n = len(b) TypeError:'_io.TextIOWrapper'類型的對象沒有len() – Zoro99

+0

@ Zoro99可能需要查看[this](http://stackoverflow.com/a/17570045/3375713)。確保'file1_lines'和'file2_lines'是字符串列表。 –

相關問題