2016-10-10 1 views
3

私は、2つのプログラムのコマンドライン出力を比較する総合的な差分を作成しようとしています。私が持っている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") 

いくつかの要件を:私はdifflibを使用して、このコードを思い付いた

  • (明らかに)出力の違いにあり
  • 新ラインが何であるかを明確にする必要があり私の場合は問題であり、矛盾を引き起こすときにはっきりと見える必要があるので、\nに置き換えられます。

私はm yの関数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つの^のシンボル?彼らは何を指していますか...?また、私は意図的に新しい行を1つのテスト文字列に入れます。私はdiffがそれに気づいたとは思わない。

出力を包括的にするにはまたはを理解することを学びますか?

答えて

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。それは起こっていることではありません。入力の*実際のエンドライン文字はエスケープされているため、それらを適切に比較して出力に表示することができます。改行は、表示目的のためだけに追加されます。 – ekhumoro

関連する問題