小ネタ③ 最新の日付ファイルを取得
ファイル更新日で取得する場合
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のようなディレクトリ階層の例ですが、形式が変わると対応できません、ゴミです。
ダサさと性能のトレードオフとか意味がわかりません。
イケメンな書き方を教えてください(切実)
コメント