2016-10-10 48 views
3

我试图做出比较两个程序的命令行输出的综合比较。我用difflib以及与此代码想出了:如何理解/使用Python difflib输出?

from difflib import Differ 
from pprint import pprint 
import sys 

def readable_whitespace(line): 
    return line.replace("\n", "\\n") 

# Two strings are expected as input 
def print_diff(text1, text2): 
    d = Differ() 
    text1 = text1.splitlines(True) 
    text2 = text2.splitlines(True) 

    text1 = [readable_whitespace(line) for line in text1] 
    text1 = [readable_whitespace(line) for line in text2] 

    result = list(d.compare(text1, text2)) 
    sys.stdout.writelines(result) 
    sys.stdout.write("\n") 

一些要求我:

  • (明显)应该明确什么是从中输出时是有区别的
  • 新线被替换为\n,因为它们在我的情况下很重要,并且在导致冲突时必须清晰可见

我做了一个简单的m ŸDIFF功能:

A = "AAABAAA\n" 
A += "BBB\n" 
B = "AAAAAAA\n" 
B += "\n" 
B += "BBB" 
print_diff(A,B) 

为了您的方便,在这里与功能测试合并,这样就可以执行它的文件:http://pastebin.com/BvQw9naa

我不知道这是什么输出试图对我说:

- AAAAAAA\n?  ^^ 
+ AAAAAAA 
?  ^
- \n+ 
    BBB 

注意那两个^符号在第一行?他们指着什么......?另外,我有意将尾随的新行放入一个测试字符串中。我不认为差异注意到了这一点。

如何使输出综合学会理解它?

回答

2

你的例子的主要问题是你如何处理末尾的字符。如果您在输入中完全替换它们,则输出将不再正确排列,因此没有任何意义。为了解决这个问题,该readable_whitespace功能应该是这个样子:

def readable_whitespace(line): 
    end = len(line.rstrip('\r\n')) 
    return line[:end] + repr(line[end:])[1:-1] + '\n' 

这将处理所有类型的底线序列,并确保打印时行显示正确。

另一个小问题是由于一个错字:

text1 = [readable_whitespace(line) for line in text1] 
text1 = [readable_whitespace(line) for line in text2] 
# --^ oops!  

一旦这些修补程序是由,输出将是这样的:

- AAABAAA\n 
? ^
+ AAAAAAA\n 
? ^
+ \n 
- BBB\n 
? -- 
+ BBB 

这希望现在应该对你有意义。

+0

等等......你确定可以安全地假设所有的换行符都可以被替换,然后放在行尾? –

+1

@TomášZato。这不是发生了什么事。输入中的* actual * endline字符正在被转义,因此可以正确比较并在输出中可见。然后纯粹为显示目的添加换行符。 – ekhumoro