【问题标题】:Comparing two .txt files using difflib in Python在 Python 中使用 difflib 比较两个 .txt 文件
【发布时间】:2009-06-10 18:51:20
【问题描述】:

我正在尝试比较两个文本文件并输出比较文件中不匹配但遇到困难的第一个字符串,因为我对 python 非常陌生。谁能给我一个使用这个模块的示例方法。

当我尝试类似:

result = difflib.SequenceMatcher(None, testFile, comparisonFile)

我收到一条错误消息,提示“文件”类型的对象没有长度。

【问题讨论】:

    标签: python difflib


    【解决方案1】:

    对于初学者,您需要将字符串传递给 difflib.SequenceMatcher,而不是文件:

    # Like so
    difflib.SequenceMatcher(None, str1, str2)
    
    # Or just read the files in
    difflib.SequenceMatcher(None, file1.read(), file2.read())
    

    无论如何,这将解决您的错误。获取第一个不匹配的字符串,我带你进入difflib documentation.的精彩世界

    【讨论】:

    【解决方案2】:

    这是一个使用 Python difflib 比较两个文件内容的快速示例...

    import difflib
    
    file1 = "myFile1.txt"
    file2 = "myFile2.txt"
    
    diff = difflib.ndiff(open(file1).readlines(),open(file2).readlines())
    print ''.join(diff),
    

    【讨论】:

    • 我们如何避免显示相同的行?我只想打印不同的行。
    • @OlivierCervello import difflib, sys with open("a") as a: a_content = a.readlines() with open("b") as b: b_content = b.readlines() diff = difflib.unified_diff(a_content,b_content) print("***** 统一差异 ************") print("行号"+'\t'+'file1'+'\ t'+'file2') for i,line in enumerate(diff): if line.startswith("-"): print(i,'\t\t'+line) elif line.startswith("+"):打印(i,'\t\t\t\t\t\t'+行)'
    【解决方案3】:

    你确定这两个文件都存在吗?

    刚刚测试过,我得到了完美的结果。

    为了得到结果,我使用了类似的东西:

    import difflib
    
    diff=difflib.ndiff(open(testFile).readlines(), open(comparisonFile).readlines())
    
    try:
        while 1:
            print diff.next(),
    except:
        pass
    

    每行的第一个字符表示它们是否不同: eg.: '+' 表示已添加以下行等。

    【讨论】:

    • 哎呀,你是对的愚蠢的错误。但我仍然不确定如何从结果中获取我需要的数据。我怎么知道它们是否不同?如何获得第一个不同的字符串?抱歉很多问题:(
    【解决方案4】:

    听起来您可能根本不需要 difflib。如果您是逐行比较,请尝试以下操作:

    test_lines = open("test.txt").readlines()
    correct_lines = open("correct.txt").readlines()
    
    for test, correct in zip(test_lines, correct_lines):
        if test != correct:
            print "Oh no! Expected %r; got %r." % (correct, test)
            break
    else:
        len_diff = len(test_lines) - len(correct_lines)
        if len_diff > 0:
            print "Test file had too much data."
        elif len_diff < 0:
            print "Test file had too little data."
        else:
            print "Everything was correct!"
    

    【讨论】:

    • 那里不需要 readlines,zip 也可以处理文件处理程序
    • 如果文件的行数相同但内容不同,这不会中断吗?
    【解决方案5】:

    另一种更简单的方法来逐行检查两个文本文件是否相同。试试看。

    fname1 = 'text1.txt'
    fname2 = 'text2.txt'
    
    f1 = open(fname1)
    f2 = open(fname2)
    
    lines1 = f1.readlines()
    lines2 = f2.readlines()
    i = 0
    f1.seek(0)
    f2.seek(0)
    for line1 in f1:
        if lines1[i] != lines2[i]:
            print(lines1[i])
            exit(0)
        i = i+1
    
    print("both are equal")
    
    f1.close()
    f2.close()
    

    否则,filecmp中的python中有一个预定义的文件可以使用。

    import filecmp
    
    fname1 = 'text1.txt'
    fname2 = 'text2.txt'
    
    print(filecmp.cmp(fname1, fname2))
    

    :)

    【讨论】: