比较Python中的2个文本文件

时间:2015-04-08 05:36:44

标签: python regex filehandle

我有2个txt文件。

档案A:

jack john jim
george colin stan

档案B:

hell jack john jim goad tiger
tall jack jim john filer dom
hell george colin jim stab tiger
track jack george colin stan forever

我想用文件B的每一行逐字检查文件A的每一行,如果有连续的匹配则返回true。例如

从第一个文件A中获取

并使用文件B的第一行检查,如果找到,则检查john,然后检查jim。然后我们移动文件B的第二行,依此类推。之后我们转到文件A的第二行并重复该过程。只有当匹配是连续的时才返回true,因此文件B的第一行将返回True,因为jack john和jim是有序的,但是文件B的第二行将是返回false,因为它们的顺序不正确。

我必须逐字逐句地将其视为一个字符串,因此必须将其分解为单词然后逐字逐句地进行比较。

2 个答案:

答案 0 :(得分:0)

如果你有单独的单词,你可以

in_file.readlines()

获取行列表。如果单行上的所有单词都用空格分隔,则执行:

in_file.read().split(' ')

比较应该是直截了当的,如下所示:

def compare(a_words, b_words):
    for a_word, b_word in izip(a_words, b_words):
        if a_word != b_word:
            return False
    return True

如果你有多行,每行有多个单词,那么你应该首先读取所有行,然后对每一行调用compare函数传递它从每行分开的单词。

答案 1 :(得分:0)

这是实现比较功能的内存效率低下,粗暴的方式:

def compare(list_a,list_b):
    for a in list_a:
        try:
            b_index=list_b.index(a)
        except ValueError:
            return False
        return compare(list_a[1:],b[b_index:])

你需要逐行读取每个文件,这样就会有嵌套循环调用compare()函数:

a_lines_raw=a_file.readlines()
b_lines_raw=b_file.readlines()

a_lines=[ line.split() for line in a_lines_raw ]
b_lines=[ line.split() for line in b_lines_raw ]

for a_line in a_lines:
    for b_line in b_lines:
        if compare(a_line,b_line):
            print "Match:", str(a_line), str(b_line)

可以通过传递a_list和b_list的索引并使a_list和b_list“全局”到compare()函数来优化它。要么真正使它们成为“全局”,要么将compare()包装到另一个定义a_list和b_list的函数中,然后只将索引传递给函数...最后但并非最不重要的 - 将它作为类和存储实现a_list和b_list作为属性,并且compare()作为接受具有默认0索引的索引的类的方法。