简体   繁体   English

如何在python中比较两个文件并打印不匹配的行号?

[英]how to compare two files and print mismatched line number in python?

I have two files which contains same number of lines.我有两个包含相同行数的文件。

"file1.txt" contains following lines:

 Attitude is a little thing that makes a big difference
 The only disability in life is a bad attitude
 Abundance is, in large part, an attitude
 Smile when it hurts most

"file2.txt" contains:

 Attitude is a little thing that makes a big difference
 Everyone has his burden. What counts is how you carry it
 Abundance is, in large part, an attitude
 A positive attitude may not solve all your problems  

I want to compare two files line by line and if any of the line mismatches between two files i want to我想逐行比较两个文件,如果我想比较两个文件之间的任何行不匹配

 print "mismatch in line no: 2"
 print "mismatch in line no: 4"   #in this case lineno: 2 and lineno: 4 varies from second file

I tried.but i can print only the line in file1 which is differ from line in file2.can't able to print the line number of mismatched lines.??我试过了。但我只能打印 file1 中与 file2 中的行不同的行。无法打印不匹配行的行号。??

 My code:
 with open("file1.txt") as f1:
    lineset = set(f1)
 with open("file2.txt") as f2:
    lineset.difference_update(f2)
    for line in lineset:
        print line

Using itertools.izip andenumerate :使用itertools.izipenumerate

import itertools

with open('file1.txt') as f1, open('file2.txt') as f2:
    for lineno, (line1, line2) in enumerate(itertools.izip(f1, f2), 1):
        if line1 != line2:
            print 'mismatch in line no:', lineno

What if:如果:

with open("file1.txt") as f1:
    with open("file2.txt") as f2:
        for idx, (lineA, lineB) in enumerate(zip(f1, f2)):
            if lineA != lineB:
                print 'mismatch in line no: {0}'.format(idx)

Or if there are a different number of rows you can try izip_longest或者,如果行数不同,您可以尝试izip_longest

import itertools

with open("file1.txt") as f1:
    with open("file2.txt") as f2:
        for idx, (lineA, lineB) in enumerate(itertools.izip_longest(f1, f2)):
            if lineA != lineB:
                print 'mismatch in line no: {0}'.format(idx)

You might be able to use the difflib module.您也许可以使用difflib模块。 Here's a simple example using its difflib.Differ class:这是一个使用其difflib.Differ类的简单示例:

import difflib
import sys

with open('file1.txt') as file1, open('file2.txt') as file2:
    line_formatter = '{:3d}  {}'.format
    file1_lines = [line_formatter(i, line) for i, line in enumerate(file1, 1)]
    file2_lines = [line_formatter(i, line) for i, line in enumerate(file2, 1)]
    results = difflib.Differ().compare(file1_lines, file2_lines)
    sys.stdout.writelines(results)

Output:输出:

    1  Attitude is a little thing that makes a big difference
-   2  The only disability in life is a bad attitude
+   2  Everyone has his burden. What counts is how you carry it
    3  Abundance is, in large part, an attitude
-   4  Smile when it hurts most
+   4  A positive attitude may not solve all your problems

The minus and plus characters in the first column indicate lines that were replaced in typical diff utility program style.第一列中的减号和加号字符表示以典型diff实用程序样式替换的行。 The absence of any indicator means the line was the same in both files -- you could suppress the printing of those if you wished, but to keep the example simple everything the compare() method creates is being printed.没有任何指示符意味着这两个文件中的行是相同的——如果你愿意,你可以禁止打印那些,但为了保持示例简单, compare()方法创建的所有内容都被打印。

For reference, here's the contents of the two files side-by-side with line numbers shown:作为参考,以下是并排显示的两个文件的内容,并显示了行号:

1  Attitude is a little thing that makes a big difference    Attitude is a little thing that makes a big difference
2  The only disability in life is a bad attitude             Everyone has his burden. What counts is how you carry it
3  Abundance is, in large part, an attitude                  Abundance is, in large part, an attitude
4  Smile when it hurts most                                  A positive attitude may not solve all your problems
import itertools

with open('file1.txt') as f1, open('file2.txt') as f2:
    for lineno, (line1, line2) in enumerate(zip(f1, f2), 1):
        if line1 != line2:
            print ('mismatch in line no:', lineno)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM