web-dev-qa-db-ja.com

ファイルを日付順に検索しますか?

このコード行は、pythonスクリプトにあります。特定のディレクトリにあるすべてのファイルで* cycle * .logを検索します。

for searchedfile in glob.glob("*cycle*.log"):

これは完全に機能しますが、ネットワークの場所でスクリプトを実行すると、スクリプトが順番に検索されず、ランダムに検索されます。

コードに日付順で強制的に検索させる方法はありますか?

この質問はphpに対して行われましたが、違いがわかりません。

ありがとう

21
Jason Rogers

ファイルを日付順に並べ替えるには:

import glob
import os

files = glob.glob("*cycle*.log")
files.sort(key=os.path.getmtime)
print("\n".join(files))

ソート方法 も参照してください。

61
jfs

上手。答えはノーです。 glob 使用 os.listdir これは以下によって記述されます:

"パスで指定されたディレクトリ内のエントリの名前を含むリストを返します。リストは任意の順序です。特別なエントリ「。」は含まれません。および '..'がディレクトリに存在する場合でも。 "

だからあなたは実際にあなたがそれを並べ替えることができてラッキーです。自分で分類する必要があります。

これは私にとってはうまくいきます:

import glob
import os
import time

searchedfile = glob.glob("*.cpp")
files = sorted( searchedfile, key = lambda file: os.path.getctime(file))

for file in files:
 print("{} - {}".format(file, time.ctime(os.path.getctime(file))) )

また、これは作成時間を使用することに注意してください。変更時間を使用する場合、使用される関数はgetmtimeでなければなりません。

4
luk32

本質的に@jfsと同じですが、sortedを使用して1行で

import os,glob
searchedfiles = sorted(glob.glob("*cycle*.log"), key=os.path.getmtime)
3
Pablo Reyes

パスが並べ替え可能な順序になっている場合は、いつでも文字列として並べ替えることができます(他の人がすでに回答で述べているように)。

ただし、パスで%d.%m.%Yのような日時形式を使用する場合は、少し複雑になります。 strptimeはワイルドカードをサポートしていないため、ワイルドカードを含むパスから日付/時刻を解析するモジュール datetime-glob を開発しました。

datetime-globを使用すると、ツリーをウォークスルーし、ディレクトリをリストし、日付/時刻を解析して、タプル(date/time, path)としてソートできます。

モジュールのテストケースから:

import pathlib
import tempfile

import datetime_glob

def test_sort_listdir(self):
    with tempfile.TemporaryDirectory() as tempdir:
        pth = pathlib.Path(tempdir)
        (pth / 'some-description-20.3.2016.txt').write_text('tested')
        (pth / 'other-description-7.4.2016.txt').write_text('tested')
        (pth / 'yet-another-description-1.1.2016.txt').write_text('tested')

        matcher = datetime_glob.Matcher(pattern='*%-d.%-m.%Y.txt')
        subpths_matches = [(subpth, matcher.match(subpth.name)) for subpth in pth.iterdir()]
        dtimes_subpths = [(mtch.as_datetime(), subpth) for subpth, mtch in subpths_matches]

        subpths = [subpth for _, subpth in sorted(dtimes_subpths)]

        # yapf: disable
        expected = [
            pth / 'yet-another-description-1.1.2016.txt',
            pth / 'some-description-20.3.2016.txt',
            pth / 'other-description-7.4.2016.txt'
        ]
        # yapf: enable

        self.assertListEqual(subpths, expected)
0
marko.ristin

os.path.getmtimeまたはos.path.getctimeを使用して、戻ってきたファイルのリストを並べ替えることができます。この他の SO answer を参照し、コメントにも注意してください。

0
Tom

グロブ番号を使用します。現時点では、globはすべてのファイルをコードに同時に保存しており、これらのファイルを整理する方法はありません。最終結果だけが重要な場合は、ファイルの日付をチェックし、それに基づいて再ソートする2番目のループを使用できます。解析順序が重要である場合、globはおそらくこれを行うための最良の方法ではありません。

0
Dylan Lawrence