Cluttered Room

Cluttered Room

雑然とした部屋

2分で読めます

Pythonのfilecmpは引数にshallow = True を付ける(デフォルト)と「浅い」ファイル比較を行う。この際に何を参照して「同じファイル」と判断するのか調べる必要があったのでメモ。 なお、この記事はPython 3.7 時点での情報である。

結論から言うと、ファイルサイズと最終更新日時が同一ならば同一のファイルとして判断される。

解説として、「浅い」ファイル比較はファイルごとにシグネチャを生成し、それらが同じならば同じファイルであると判断する。そしてその際の生成コードが

 _sig(st):
    return (stat.S_IFMT(st.st_mode),
            st.st_size,
            st.st_mtime)

となっている1

引数のstos.stat_resultオブジェクトであるので、st_modest_sizest_mtimeの3つから同じファイルか判断していることになる。

このうち、 st_modeはファイルタイプとファイルモード2の判定であるので、実質的にはst_size、つまりファイルサイズと、st_mtime、つまり最終更新日時で判定していることになる。

なお、shallow = Falseとして「深い」ファイル比較を行うと、文字通り バイト単位でファイルの同一性をチェックする。当然ながら「浅い」ファイル比較よりも処理に時間がかかるが、より確実性を求める場合はこちらを使用することも検討すべきかもしれない。


  1. https://github.com/python/cpython/blob/3.7/Lib/filecmp.py ↩︎

  2. ディレクトリか?ファイルか?シンボリックリンクか?etc. ↩︎

comments powered by Disqus

最近の投稿

カテゴリ