2013-04-29 68 views
1

我有兩個文本文件,我想用Python進行比較。這兩個文件的標題都有Date。所以,我想在比較時忽略這一行,因爲它總是會有所不同,不應視爲差異。使用Python比較文件時忽略行

文件1

Date : 04/29/2013 
Some Text 
More Text 
.... 

文件2

Date : 04/28/2013 
Some Text 
More Text 
.... 

我曾嘗試使用filecmp模塊對它們進行比較,但是,這並不支持任何論點忽略任何圖案。有沒有其他模塊可以用於此目的。我嘗試使用difflib,但沒有成功。此外,我只想要是否有不同的黑白文件作爲True or False,difflib打印所有行,即使沒有差異using whitespace

回答

4

使用itertools.ifilter(或在Python 3只正常filter

itertools.ifilter(predicate, iterable)

你的謂語應該是一個函數,要忽略行返回False。 例如。

def predicate(line): 
    if 'something' in line: 
     return False # ignore it 
    return True 

然後在你的文件對象上使用它。 fin = ifilter(predicate, fin)

然後,只需使用類似

from itertools import izip, ifilter # on Py3 instead use normal zip and filter 
f1 = ifilter(predicate, f1) 
f2 = ifilter(predicate, f2) 

all(x == y for x, y in izip(f1, f2)) 

,除非你想看到什麼差異,既然你已經嘗試filcmp我以爲你只是想知道是否有區別你不需要difflib或不。不幸的是,filecmp只適用於文件名。

而且跳過每個文件的第一行只是用itertools.islice(fin, 1, None)

from itertools import islice, izip 

def predicate(line): 
    ''' you can add other general checks in here ''' 
    if line.startswith('Date'): 
     return False # ignore it 
    return True 

with open('File1.txt') as f1, open('File2.txt') as f2: 
    f1 = ifilter(predicate, f1) 
    f2 = ifilter(predicate, f2) 
    print(all(x == y for x, y in izip(f1, f2))) 

>>> True 
+0

我試過這個,但是我收到錯誤。如果我做錯了,你能糾正我嗎?>>> fo1 = open(「file1.txt」,「r」) >>> fo2 = open(「file2。(x),y​​(x),y​​(x,y)), izip(F1,F2)) 回溯(最近通話最後一個): 文件 「」,1號線,在 文件 「」,1號線,在 類型錯誤: '海峽' 對象沒有callable' – sarbjit 2013-04-29 10:44:24

+0

@sarbjit'predicate'應該是一個函數,我更新了我的答案以顯示一個示例。 – jamylak 2013-04-29 10:46:06

+0

非常好!!感謝您的幫助 – sarbjit 2013-04-29 10:52:36

0

如果你知道這個日期總是在第一行,你複製一個字符串列表行,你纔可以通過寫行刪除第一線

:評論後

添加[1]

可能最好在另一個解決方案中使用ifilter。 如果文件不同,您必須遍歷它們(使用兩個索引,每個文件一個索引)並跳過包含其中一個關鍵字的行。

+4

不理想的,如果大...使用itertools.islice(FH,1,無),並遍歷該 - 是更通用的,並節省內存 – 2013-04-29 09:43:44

+0

那麼,在大多數文件日期會有所不同,通常是在第一線。但是我的一些文件有其他關鍵字,這些關鍵字會有所不同,並且可能在文件的任何位置。所以,我正在尋找一種更通用的解決方案,可以用於每種情況。 – sarbjit 2013-04-29 09:43:56