difflib.Differを使用して、行を説明する各行の先頭にマーカーが付いた単一の行シーケンスを返すことができます。マーカーは、ラインに関する次の情報を示します。
マーカー |
説明 |
'- ' |
ファイル 1 に固有の行 |
'+ ' |
ファイル 2 に固有の行 |
' ' |
両方のファイルに共通の行 |
'? ' |
どちらの入力ファイルにも存在しない行 |
この情報を使用して、データの表示方法を決定できます。たとえば、マーカーが
の場合、線を左右のウィジェットの両方に配置します。の場合+
は、左側に空白行を配置し、右側に実際の行を配置して、その行が右側のテキストに固有であることを示します。同様に-
、線が左に固有であることを意味します。
たとえば、左用と右用の2 つのテキスト ウィジェットt1
とを作成できます。t2
2 つのファイルを比較するには、それぞれの行のリストを作成し、それらをcompare
difference メソッドに渡し、結果を反復処理します。
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:])
上記のコードは、マーカーのある行を無視し?
ます。これは、前の行のさまざまな文字に注意を向けようとする余分な行であり、実際にはどちらのファイルにも含まれていないためです。必要に応じて、その情報を使用して個々の文字を強調表示できます。