18

私は Python 2.6 を使用しており、2 つのテキスト ファイル (file1.txt & file2.txt) を比較する 2 つのテキスト ペインを並べて表示する単純な GUI を作成したいと考えています。

私はdifflibを使用していますが、 sdiff Unix コマンドと同様の結果を生成する方法が明確ではありません。

並べて比較を再現するには、たとえば2 つの変数とを返すdifflibが必要です。file1_difffile2_diff

また、 sdiff出力を直接使用し、それを解析してペインを分離することも検討しましたが、見た目ほど簡単ではないことが判明しました...ヒントはありますか?

4

3 に答える 3

3

difflib.Differを使用して、行を説明する各行の先頭にマーカーが付いた単一の行シーケンスを返すことができます。マーカーは、ラインに関する次の情報を示します。

マーカー 説明
'- ' ファイル 1 に固有の行
'+ ' ファイル 2 に固有の行
' ' 両方のファイルに共通の行
'? ' どちらの入力ファイルにも存在しない行

この情報を使用して、データの表示方法を決定できます。たとえば、マーカーが の場合、線を左右のウィジェットの両方に配置します。の場合+ は、左側に空白行を配置し、右側に実際の行を配置して、その行が右側のテキストに固有であることを示します。同様に- 、線が左に固有であることを意味します。

たとえば、左用と右用の2 つのテキスト ウィジェットt1とを作成できます。t22 つのファイルを比較するには、それぞれの行のリストを作成し、それらをcomparedifference メソッドに渡し、結果を反復処理します。

t1 = tk.Text(...)
t2 = tk.Text(...)

f1 = open("file1.txt", "r").readlines()
f2 = open("file2.txt", "r").readlines()

differ = difflib.Differ()
for line in differ.compare(f1, f2):
    marker = line[0]
    if marker == " ":
        # line is same in both
        t1.insert("end", line[2:])
        t2.insert("end", line[2:])

    elif marker == "-":
        # line is only on the left
        t1.insert("end", line[2:])
        t2.insert("end", "\n")

    elif marker == "+":
        # line is only on the right
        t1.insert("end", "\n")
        t2.insert("end", line[2:])

上記のコードは、マーカーのある行を無視し? ます。これは、前の行のさまざまな文字に注意を向けようとする余分な行であり、実際にはどちらのファイルにも含まれていないためです。必要に応じて、その情報を使用して個々の文字を強調表示できます。

于 2021-02-07T18:42:35.010 に答える
1

このようなものはどうですか?

>>> a = ['cat', 'dog', 'horse']
>>> b = ['cat', 'horse', 'chicken']
>>> comparison = list(l for l in difflib.Differ().compare(a,b) if not l.startswith('?'))
>>> left = [l[2:] if l.startswith((' ', '-')) else '' for l in comparison]
>>> right = [l[2:] if l.startswith((' ', '+')) else '' for l in comparison]
>>> left
['cat', 'dog', 'horse', '']
>>> right
['cat', '', 'horse', 'chicken']
于 2020-11-05T01:46:37.560 に答える
-2

私はdifflib.context_diffでファイルの差分をとろうとしました:

diff = difflib.context_diff(fromlines, tolines, fromfile='file1.txt', tofile='file2.txt')
sys.stdout.writelines(diff)

この場合、出力は次のようになります。

*** file1.txt
--- file2.txt
***************
*** 1,6 ****
! aasdf
  qwer
  123
! poiu
! xzcv34
  xzcv
--- 1,6 ----
! asdf
  qwer
+ mnbv
  123
! cvnn
  xzcv

この場合、各ファイルの diff を簡単に分離できますが、context_diff の出力に満足できるかどうかはわかりません。difflib をどのように使用しているかについては言及していません。

于 2015-06-24T13:04:19.173 に答える