スポンサーリンク

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

スポンサーリンク