Python 標準ライブラリ filecmp ファイル・ディレクトリ比較
Publish date: 2021-08-03
filecmpを使うとファイルやディレクトリの比較を行うことができる。
比較用サンプルファイルの準備
import pathlib
pathlib.Path("./test/A/file1.txt").write_text("TEST1",encoding='utf8')
pathlib.Path("./test/A/file2.txt").write_text("TEST2",encoding='utf8')
pathlib.Path("./test/A/file3.txt").write_text("TEST3",encoding='utf8')
pathlib.Path("./test/B/file1.txt").write_text("TEST1",encoding='utf8')
pathlib.Path("./test/B/file2.txt").write_text("TEST2XXX",encoding='utf8')
pathlib.Path("./test/B/file4.txt").write_text("TEST4",encoding='utf8')
関数
ファイルの比較
import filecmp
# cmp(f1, f2, shallow=True) ファイルの比較
filecmp.cmp("./test/A/file1.txt","./test/B/file1.txt") # => True
filecmp.cmp("./test/A/file2.txt","./test/B/file2.txt") # => False
filecmp.cmp("./test/A/file3.txt","./test/B/file3.txt") # => False
# cmpfiles(dir1, dir2, common, shallow=True) ディレクトリ内ファイルの比較
# 戻り値は(一致したファイル、一致しないファイル、比較されなかったファイル)
filecmp.cmpfiles("./test/A/","./test/B/", ["file1.txt","file2.txt","file3.txt"])
# => (['file1.txt'], ['file2.txt'], ['file3.txt'])
clear_cache() キャッシュクリア
filecmp.clear_cache()
ディレクトリ比較オブジェクト
filecmp.dircmp(a, b, ignore=None, hide=None)
cmp = filecmp.dircmp("./test/A/","./test/B/")
# 比較
cmp.report()
## 直下にある共通要素の比較
# cmp.report_partial_closure()
## 再帰的な比較
# cmp.report_full_closure()
diff ./test/A/ ./test/B/
Only in ./test/A/ : ['file3.txt']
Only in ./test/B/ : ['file4.txt']
Identical files : ['file1.txt']
Differing files : ['file2.txt']
プロパティ
# 両方にあるファイル・ディレクトリ
cmp.common # => ['file1.txt', 'file2.txt']
# 比較対象のディレクトリ
cmp.left # => './test/A/'
cmp.right # => './test/B/'
# どちらかにだけあるファイル・ディレクトリ
cmp.left_only # => ['file3.txt']
cmp.right_only # => ['file4.txt']
# どちらかのファイル・ディレクトリ
cmp.left_list # => ['file1.txt', 'file2.txt', 'file3.txt']
cmp.right_list # => ['file1.txt', 'file2.txt', 'file4.txt']
# 両方にあるディレクトリ
cmp.common_dirs # => []
# 両方にあるファイル
cmp.common_files # => ['file1.txt', 'file2.txt']
a および b の両方にあるファイルです。
# 両方にあってディレクトリ間でタイプが異なるかos.stat()がエラー
cmp.common_funny # => []
# 同一のファイル
cmp.same_files # => ['file1.txt']
# 異なるファイル
cmp.diff_files # => ['file2.txt']
# 比較されなかったファイル
cmp.funny_files # => []