2016-10-10 45 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