unified形式で差分を抽出
下記がサンプルコードになります。
in1.txtとin2.txtの差分をunified形式で抽出しています。
difflibをimportして、unified_diff()を実行しています。
$ cat sample.py
#!/usr/bin/env python3
# coding: UTF-8
import difflib as diff
with open('in1.txt','r') as f:
str1 = f.readlines()
with open('in2.txt','r') as f:
str2 = f.readlines()
print(str1)
print(str2)
for i in diff.unified_diff(str1, str2, fromfile='in1.txt', tofile='in2.txt'):
print(i, end='')
下記が実行結果になります。
print出力の際は、end=''をprint()に設定しないと、改行が付与されて1行飛びになってしまいます。
参考:[Python]改行なしでprint出力する(end=''を設定)
$ ./sample.py ['line1,1\n', 'line2,9\n', 'line3,3\n', 'line4,7\n', 'line4,8\n'] ['line1,1\n', 'line2,9\n', 'line3,3\n', 'diff\n', 'line4,7\n', 'line4,8\n'] --- in1.txt +++ in2.txt @@ -1,5 +1,6 @@ line1,1 line2,9 line3,3 +diff line4,7 line4,8
context形式で差分を抽出
context形式で差分を抽出する場合には、difflibをimportしてcontext_diff()を使います。
下記がサンプルコードになります。
$ cat sample2.py
#!/usr/bin/env python3
# coding: UTF-8
import difflib as diff
with open('in1.txt','r') as f:
str1 = f.readlines()
with open('in2.txt','r') as f:
str2 = f.readlines()
print(str1)
print(str2)
for i in diff.context_diff(str1, str2, fromfile='in1.txt', tofile='in2.txt'):
print(i, end='')
下記が実行結果になります。
$ ./sample2.py ['line1,1\n', 'line2,9\n', 'line3,3\n', 'line4,7\n', 'line4,8\n'] ['line1,1\n', 'line2,9\n', 'line3,3\n', 'diff\n', 'line4,7\n', 'line4,8\n'] *** in1.txt --- in2.txt *************** *** 1,5 **** --- 1,6 ---- line1,1 line2,9 line3,3 + diff line4,7 line4,8
シェルのdiffコマンドを使う
diffコマンドが定番ですね。
参考:diffの-u/-c/-yオプションで表示形式を変更
diffコマンドの-uオプションでUnified形式で出力。
$ diff -u in1.txt in2.txt --- in1.txt 2019-02-16 19:52:37.000000000 +0900 +++ in2.txt 2019-04-30 19:55:59.000000000 +0900 @@ -1,5 +1,6 @@ line1,1 line2,9 line3,3 +diff line4,7 line4,8
diffコマンドの-cオプションでContext形式で出力。
$ diff -c in1.txt in2.txt *** in1.txt 2019-02-16 19:52:37.000000000 +0900 --- in2.txt 2019-04-30 19:55:59.000000000 +0900 *************** *** 1,5 **** --- 1,6 ---- line1,1 line2,9 line3,3 + diff line4,7 line4,8
