【问题标题】:Comparing 2 txt files in Python在 Python 中比较 2 个 txt 文件
【发布时间】:2015-04-08 05:36:44
【问题描述】:

我有 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

我希望文件 A 的每一行都与文件 B 的每一行逐字检查,如果有连续匹配则返回 true。比如

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

我要一个字一个字地看,不会把整行当成一个字符串,所以要拆成字再逐字比较..

【问题讨论】:

  • 你最后试过了吗?

标签: python regex filehandle


【解决方案1】:

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

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。

【讨论】:

    【解决方案2】:

    如果每个单词都在单独的行中,则可以这样做

    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
    

    如果您有多行,每行包含多个单词,那么您应该首先阅读所有行,然后为每一行调用比较函数,将每行拆分的单词传递给它。

    【讨论】:

    • 这不会产生理想的结果,因为它只会匹配单词的完全相同的位置而不是相对位置。
    • 这是一个简单的比较,如上所述,我实际上需要的是我们需要跟踪位置,即如果有第一个匹配项,则下一个匹配项应该是第二个文件中的直接匹配项,因此上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多