2

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

文件 1

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

文件2

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

我尝试使用filecmp模块比较它们,但这不支持任何忽略任何模式的参数。是否有任何其他模块可用于此目的。我尝试使用difflib但没有成功。此外,我只想知道是否存在差异 b/w 文件,因为即使没有差异True or False,也正在打印所有行。difflibusing whitespace

4

2 回答 2

5

使用(或在 Python 3 中itertools.ifilter内置)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 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)

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
于 2013-04-29T09:51:14.130 回答
0

如果您知道此日期始终在第一行,并且您将这些行复制到字符串列表中,则可以通过编写 lines[1:] 来删除第一行

评论后补充:

可能最好在其他解决方案中使用 ifilter 。如果文件不同,您必须遍历它们(使用两个索引,每个文件一个)并跳过包含关键字之一的行。

于 2013-04-29T09:38:36.863 回答