Pythonのfilecmpモジュールでファイルとディレクトリを比較する方法
Pythonの標準ライブラリには、ファイルやディレクトリを比較するための関数を提供するfilecmpモジュールが用意されています。この比較では、ファイルの中身(データ)だけでなく、タイムスタンプなどのファイル属性(メタデータ)も考慮されるのが特徴です。
本記事のコード例では、以下のようなファイル・ディレクトリ構成を使用します。
まず、カレントワーキングディレクトリ直下に「dir1」と「dir2」の2つのディレクトリを作成し、それぞれに次のファイルを配置します。
--dir1/newfile.txt-- This is a file in dir1 --dir1/file1.txt-- Hello Python --dir1/file2.txt-- Python Standard Library --dir2/file1.txt-- Hello Python --dir2/file2.txt-- Python Library
それでは、filecmpモジュールが提供する各種比較機能を順番に見ていきましょう。
filecmp.cmp(f1, f2, shallow=True)
この関数は2つのファイルを比較し、同一であればTrue、異なっていればFalseを返します。引数shallowはデフォルトでTrueになっており、この場合は内容に加えてメタデータも比較対象となります。shallow=Falseを指定すると、内容のみが比較されます。
上記のファイル構成をもとにコードを実行すると、次のような結果が得られます。
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt')
True
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt', shallow = False)
True
>>> filecmp.cmp('dir1/file2.txt', 'dir2/file2.txt')
Falsefilecmp.cmpfiles(dir1, dir2, common, shallow=True)
この関数は、2つのディレクトリ内の複数ファイルを一括して比較し、3要素のタプルを返します。第1要素は一致したファイルのリスト、第2要素は一致しなかったファイルのリスト、第3要素は比較時にエラーとなったファイルのリストです。
>>> match, mismatch, errors = filecmp.cmpfiles('dir1','dir2',['file1.txt', 'file2.txt'])
>>> match
['file1.txt']
>>> mismatch
['file2.txt']
>>> errors
[]dircmpクラスによるディレクトリ比較
filecmpモジュールには、dircmpクラスも定義されています。このクラスのインスタンスは「ディレクトリ比較オブジェクト」と呼ばれ、左(left)と右(right)として指定した2つのディレクトリ内のファイルを比較できます。生成したオブジェクトに対しては、以下に示すさまざまなメソッドや属性を利用可能です。
filecmp.dircmp(a, b)
これはコンストラクタです。引数aとbには、比較対象となるディレクトリを指定します。デフォルトでは、ディレクトリ内のシステムファイル(隠しファイル)は除外され、比較の対象外となります。
>>> result = filecmp.dircmp('dir1', 'dir2')dircmpクラスの主なメソッドと属性は以下のとおりです。
report()
このメソッドは、ディレクトリ間の比較結果を読みやすい形式で出力します。
>>> result = filecmp.dircmp('dir1', 'dir2')
>>> result.report()
diff dir1 dir2
Only in dir1 : ['newfile.txt']
Identical files : ['file1.txt']
Differing files : ['file2.txt']left / right
これらの属性は、dircmpコンストラクタに渡された第1・第2ディレクトリの名前を返します。
>>> result.left 'dir1' >>> result.right 'dir2'
left_list / right_list
これらの属性は、それぞれ左・右のディレクトリに含まれるファイルの一覧を返します。
>>> result.left_list ['file1.txt', 'file2.txt', 'newfile.txt'] >>> result.right_list ['file1.txt', 'file2.txt']
common / common_files / common_dirs
これらの属性は、両ディレクトリに共通するファイル・ディレクトリ、共通するファイルのみ、共通するディレクトリのみをそれぞれ返します。
>>> result.common ['file1.txt', 'file2.txt'] >>> result.common_files ['file1.txt', 'file2.txt'] >>> result.common_dirs []
same_files / diff_files
これらの属性は、dircmpクラスの比較処理の結果に基づいて、同一のファイルと内容が異なるファイルのリストをそれぞれ返します。
>>> result.same_files ['file1.txt'] >>> result.diff_files ['file2.txt']
本記事では、filecmpモジュールに定義されたファイル比較関数(cmp・cmpfiles)と、dircmpクラスおよびそのメソッド・属性について解説しました。これらを活用すれば、ファイルやディレクトリの差分確認を簡単かつ効率的に行うことができます。
-
【初心者向け】Pythonでファイルをコピーする方法を徹底解説
Pythonでファイルをコピーする基本の方法 Pythonでファイルやフォルダをコピーするには、標準ライブラリのshutilモジュールを使用します。shutilモジュールには、単一のファイルだけでなく、フォルダ全体をまとめてコピーするための関数も用意されており、追加インストールなしですぐに利用できます。 shutil.copy() の基本的な使い方 shutil.copy(コピー元, コピー先) を呼び出すと、コピー元のパスにあるファイルが、コピー先のパスで指定したフォルダへコピーされます。コピー元とコピー先はどちらも文字列で指定します。 ポイントは以下の通りです。 コピー先にファイル名を
-
Pythonでディレクトリ内の複数のファイルを削除する方法
Pythonでは、osモジュールに用意されている関数を使うことで、単一のファイルや空のフォルダを簡単に削除できます。この記事では、1つのファイルの削除から、複数ファイルの一括削除、さらには正規表現を使ったパターンマッチングによる削除まで、具体的な方法を解説します。単一ファイルの削除まず、基本的な例として、my_file.txtというファイルを削除する場合は以下のように記述します。>>> import os >>> os.remove(my_file.txt)os.remove()の引数には、絶対パスまたは相対パスを指定します。指定したパスにファイルが存在しな