Pythonのfilecmp
は引数にshallow = True
を付ける(デフォルト)と「浅い」ファイル比較を行う。この際に何を参照して「同じファイル」と判断するのか調べる必要があったのでメモ。
なお、この記事はPython 3.7 時点での情報である。
結論から言うと、ファイルサイズと最終更新日時が同一ならば同一のファイルとして判断される。
解説として、「浅い」ファイル比較はファイルごとにシグネチャを生成し、それらが同じならば同じファイルであると判断する。そしてその際の生成コードが
_sig(st):
return (stat.S_IFMT(st.st_mode),
st.st_size,
st.st_mtime)
となっている1。
引数のst
はos.stat_result
オブジェクトであるので、st_mode
、 st_size
、 st_mtime
の3つから同じファイルか判断していることになる。
このうち、 st_mode
はファイルタイプとファイルモード2の判定であるので、実質的にはst_size
、つまりファイルサイズと、st_mtime
、つまり最終更新日時で判定していることになる。
なお、shallow = False
として「深い」ファイル比較を行うと、文字通り バイト単位でファイルの同一性をチェックする。当然ながら「浅い」ファイル比較よりも処理に時間がかかるが、より確実性を求める場合はこちらを使用することも検討すべきかもしれない。
-
https://github.com/python/cpython/blob/3.7/Lib/filecmp.py ↩︎
-
ディレクトリか?ファイルか?シンボリックリンクか?etc. ↩︎