Pythonとのファイルとディレクトリの比較
07Jan2019
Python標準ライブラリは、ファイルシステムの処理を含む強力なツールセットを提供しています。 この簡単な小さな記事では、filecmpモジュールとファイルやディレクトリを比較するための便利なレシピのカップルが表示されます。
ファイルやフォルダ(here、hereなど)が苦しい混乱しているとき、Pythonは検索と比較を自動化するのがあなたの友人です。 これは、手動で各ファイルを通過するのではなく、ファイルとディレクトリの自動処理、変更または削除と組み合わせることができます。
公正な警告:削除、名前の変更、コピーなどの操作でファイルシステムを変更するときは、常にコードを適切にチェックしてテストしてください。 また、あなたの重要なファイルの複数のコピーを保持する”二つは一つであり、一つはなしである”。
filecmp
モジュールには、2つのファイルを比較できるcmp()
関数があります。 デフォルトでは、比較は浅い(shallow=True
)であり、osのみを意味します。両方のファイルのstat()署名(サイズ、変更日など)が比較されます。 shallow=False
を設定すると、ファイルの内容を比較することによって比較が行われ、より多くの時間がかかります。 フォルダ内のすべての重複を見つけるために使用できるスニペットは次のとおりです:
import osimport itertoolsimport filecmpfiles = os.listdir('path/to/directory')for f1, f2 in itertools.combinations(files, 2): if filecmp.cmp(f1, f2): print(f1, f2)
ここでは、Python標準ライブラリの別の非常に便利なモジュール、itertoolsモジュールの使用を見ることができます。 この場合、ファイルのリストの長さ2のすべての順列を返すcombinations()関数を見ることができます。 これにより、各ファイルがリスト内の他のファイルと比較されます。 フォルダー内のすべてのファイルを再帰的に検索するには、前のコードのfiles = os.listdir('...')
を次のように置き換えます:
files = for (dirpath, dirnames, filenames) in os.walk('.'): for f in filenames: files.append(os.path.join(dirpath, f))
また、dircmpクラスとディレクトリを比較することもできます。 次のスニペットは、2つのフォルダーを再帰的に調べ、同じ名前を持つが異なるすべてのファイルを表示し、左または右のファイルパスに存在するすべ:
import filecmpc = filecmp.dircmp(filepath1, filepath2)def report_recursive(dcmp): for name in dcmp.diff_files: print("DIFF file %s found in %s and %s" % (name, dcmp.left, dcmp.right)) for name in dcmp.left_only: print("ONLY LEFT file %s found in %s" % (name, dcmp.left)) for name in dcmp.right_only: print("ONLY RIGHT file %s found in %s" % (name, dcmp.right)) for sub_dcmp in dcmp.subdirs.values(): print_diff_files(sub_dcmp)report_recursive(c)
これは、同じ名前の複数のフォルダがあるが、同じ内容(バックアップフォルダの異なるバージョンなど)があるかどうかわからない場合に最適な方法 これは、以前のファイル比較で見たような浅い比較のみを行うことに注意してください。