使用Python比较文件时忽略行

使用Python比较文件时忽略行,python,Python,我有两个文本文件,我想用Python进行比较。这两个文件的标题中都有日期。所以,我想在比较时忽略这一行,因为它总是不同的,不应该被视为差异 File1 Date : 04/29/2013 Some Text More Text .... 文件2 Date : 04/28/2013 Some Text More Text .... 我尝试使用filecmp模块比较它们,但这不支持忽略任何模式的任何参数。是否有其他模块可用于此目的。我尝试使用difflib,但没有成功。此外,我只想知道黑白文件是

我有两个文本文件,我想用Python进行比较。这两个文件的标题中都有日期。所以,我想在比较时忽略这一行,因为它总是不同的,不应该被视为差异

File1

Date : 04/29/2013
Some Text
More Text
....
文件2

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

我尝试使用
filecmp
模块比较它们,但这不支持忽略任何模式的任何参数。是否有其他模块可用于此目的。我尝试使用
difflib
,但没有成功。此外,我只想知道黑白文件是否存在差异,如
True或False
difflib
正在打印所有行,即使使用空格没有差异

如果您知道此日期始终在第一行,并且您复制了字符串列表中的行,您只需通过写入行[1:]

评论后添加:

可能最好在其他解决方案中使用ifilter。 如果文件不同,则必须对其进行迭代(使用两个索引,每个文件一个索引),并跳过包含其中一个关键字的行。

使用(或Python 3中的内置
过滤器

itertools.ifilter(谓词,iterable)

谓词应该是一个函数,为要忽略的行返回
False
。 例如

然后在文件对象上使用它<代码>fin=ifilter(谓词,fin)

然后用类似的方法

from itertools import izip, ifilter # on Python 3 instead use builtin zip and filter
f1 = ifilter(predicate, f1)
f2 = ifilter(predicate, f2)

all(x == y for x, y in izip(f1, f2))
您不需要
difflib
,除非您想查看差异是什么,而且既然您已经尝试了
filecmp
,我假设您只想知道是否存在差异。不幸的是,
filecmp
仅适用于文件名

同样要跳过每个文件的第一行,只需使用
itertools.islice(fin,1,None)



不理想,如果大。。。使用itertools.islice(fh,1,None)并对其进行迭代-更通用,并保存内存。在大多数文件中,日期会有所不同,通常在第一行。但是我的一些文件有其他关键字,这些关键字会有所不同,并且可以在文件中的任何位置。所以,我正在寻找一个更通用的解决方案,它适用于所有情况。我尝试过这个,但我得到了错误。如果我做错了什么,你能纠正我吗?fo1=open(“file1.txt”,“r”)>>fo2=open(“file2.txt”,“r”)>>>f1=ifilter(“Date”,fo1)>>f2=ifilter(“Date”,fo2)>>all(x==y代表x,y在izip中(f1,f2))回溯(最近一次调用):File“”,第1行,在File“”,第1行,在TypeError中:“str”对象不可调用@sarbjit
谓词
应该是一个函数,我更新了我的答案以显示一个示例。太好了!!谢谢你的帮助
from itertools import izip, ifilter # on Python 3 instead use builtin zip and filter
f1 = ifilter(predicate, f1)
f2 = ifilter(predicate, f2)

all(x == y for x, y in izip(f1, f2))
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