Python

Python小ネタ

小ネタ③ 最新の日付ファイルを取得

ファイル更新日で取得する場合

path_pattern = os.path.join(dir_name_base, "**/*.csv")

files = glob.glob(path_pattern, recursive=True)

latest_file = sorted(files, key=os.path.getmtime)[-1]

glob.glob()でパターンにマッチするファイル一覧を取得した後、mtimeで並び替えて、末尾を取得するだけです。

mtime(ファイル内容更新日時)の部分はctime(inode更新日時), atime(アクセス日時)でも可です。

ファイル名の日付文字列で取得する場合

0埋めされた日付文字列であれば以下でOKです。

dir_name_pattern = os.path.join(dir_name_base, "**/*.csv")

latest_file = sorted(glob.glob(dir_name_pattern, recursive=True))[-1]

globで再帰的にファイル一覧を取得して、並べ替えるだけの簡単なお仕事です。

ただ、この方法には欠点があります。

全てのディレクトリを再起的に探索するので、数年分とかのログディレクトリだと遅すぎて死にたくなります。


性能を気にするのであれば、以下の書き方です。

y_dirs = glob.glob(os.path.join(dir_name_base, "[0-9][0-9][0-9][0-9]"))
m_dirs = glob.glob(os.path.join(sorted(y_dirs)[-1], "[0-9][0-9]"))
d_dirs = glob.glob(os.path.join(sorted(m_dirs)[-1], "[0-9][0-9]"))
h_dirs = glob.glob(os.path.join(sorted(d_dirs)[-1], "[0-9][0-9]"))

latest_file = sorted(glob.glob(sorted(h_dirs)[-1] + "/*.csv"))[-1]

単純に%Y→%m→%dと絞りつつ探索することで、かなりマシになります。

この方法の欠点はクッソダサいことです。

上は%Y/%m/%d/%Hのようなディレクトリ階層の例ですが、形式が変わると対応できません、ゴミです。

ダサさと性能のトレードオフとか意味がわかりません。

イケメンな書き方を教えてください(切実)

参考
python でディレクトリ配下の最新のファイル名(フルパス)を取得する

コメント

タイトルとURLをコピーしました