用于2个文件的Python difflib,行号不正确

时间:2017-04-04 16:58:06

标签: python python-2.7 difflib

我必须比较Python中的2个文件,而我正在使用difflib。我分别使用ndiffunified_diff尝试了此操作。根据示例here

,2个文件的内容很简单

File_1.txt:

User1 US
User2 US
User3 US

File_2.txt:

User1 US
User2 US
User3 NG

这是适用于我的代码(没有正确的行号):

import difflib
import sys

def dif_wr(d):
    for i,line in enumerate(d):
        sys.stdout.write('{} {}' .format(i+1,line))

# Method 1
with open('File_1.txt', 'r') as h0:
    with open('File_2.txt', 'r') as h1:
        dif = difflib.unified_diff(h0.readlines(),\
                                   h1.readlines(),\
                                   fromfile='File_1.txt',tofile='File_2.txt')
dif_wr(dif)

# Method 2
with open('File_1.txt','r') as fl1, open('File_2.txt','r') as fl2:
    dif2 = difflib.ndiff(fl1.readlines(),fl2.readlines())
dif_wr(dif2)

输出 是:

1 --- File_1.txt
2 +++ File_2.txt
3 @@ -1,3 +1,3 @@
4  User1 US
5  User2 US
6 -User3 US7 +User3 NG1   User1 US
2   User2 US
3 - User3 US4 ?       ^^
5 + User3 NG6 ?       ^^

行号似乎不正确。它们似乎从第4行开始,这是错误的一行。

问题

有没有办法通过输出获得正确的行号?

1 个答案:

答案 0 :(得分:0)

unified_diff的文档说它需要参数n

  

统一差异是一种紧凑的方式,只显示已更改的行加上几行上下文。更改以内联样式显示(而不是在块之前/之后单独)。上下文行的数量由n设置,默认为3。上下文行的数量由n设置,默认为3。

此外,参数lineterm

  

对于没有尾随换行符的输入,请将lineterm参数设置为"",以便输出将统一为换行符。

要获得所需的输出,您需要关闭行终止符,然后在输出中重新添加它们。您还需要将上下文行设置为零:

import difflib
import sys    

def dif_wr(d):
    for i, line in enumerate(d):
        sys.stdout.write('{} {}\n'.format(i + 1, line))

使用字符串而不是文件的一些示例代码:

from StringIO import StringIO

file1 = """User1 US
User2 US
User3 US"""

file2 = """User1 US
User2 US
User3 NG"""

dif2 = difflib.unified_diff(StringIO(file1).readlines(),
                            StringIO(file2).readlines(),
                            fromfile='File_1.txt',
                            tofile='File_2.txt',
                            n=0,
                            lineterm="")
dif_wr(dif2)

输出:

1 --- File_1.txt
2 +++ File_2.txt
3 @@ -3,1 +3,1 @@
4 -User3 US
5 +User3 NG