Python - 2つのフォルダの差を表示する

Pythonでは「dircmp関数」を使うと、2つのフォルダにどのような差異があるのかを簡単に調べることができます。

「dircmp関数」は標準ライブラリなので、インストールをする必要はありません。


コーディング

次のコードでは、2つのフォルダを比較し3種類の差異を表示します。

  • 左のフォルダにだけ存在するファイル
  • 右のフォルダにだけ存在するファイル
  • どちらのフォルダにも存在するが、中身が異なるファイル
    (テキストファイルの場合、ファイル内容の差異を表示します)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import sys
import difflib
from filecmp import dircmp

def view_diff(dcmp):
for name in dcmp.left_only:
print('{}は{}だけに存在'.format(name, dcmp.left))
for name in dcmp.right_only:
print('{}は{}だけに存在'.format(name, dcmp.right))
for name in dcmp.diff_files:
print('{}は両者で異なります({} {})'.format(name, dcmp.left, dcmp.right))

# テキストファイルの場合、ファイル内の差分を表示する。
if name.endswith('.txt') or name.endswith('.html'):
diff_text = difflib.context_diff(open(os.path.join(dcmp.left, name)).readlines(),
open(os.path.join(dcmp.right, name)).readlines())
sys.stdout.writelines(diff_text)

# 再帰的に探す(サブフォルダを探す)
for sub_dcmp in dcmp.subdirs.values():
view_diff(sub_dcmp)

# 比較するフォルダを引数に指定
view_diff(dircmp('./a', './b'))

実行結果

実行結果は下記のようになります。

実行結果


ファイルの存在ありなしや相違のあるファイルに関してきちんと判定されていました。

ただファイル内容の差異表示に関しては、確認しづらくあまり実用的ではないかもしれません。