2013-04-29 20 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