1

Python を使用してディレクトリ ツリーから最近作成された 10 個のファイルを抽出する最適な方法を見つけようとしています。[1, 2] の興味深い解決策を見つけましたが、それらは 1 つのファイルしか関係していませんでした。

                      ├── d1
                      │   ├── d1-1
                      │   ├── d1-1
                      :
                      ├── d2
                      │   ├── d2-1
                      │   └── d2-2
                      │   │   ├── f1.xxx
                      : :
                      │   │   ├── fn.xxx
                      ├── d3
                      │   ├── d3-1
                      :
                      :

現時点で考えられる唯一の方法は、10 個の結果が必要になるまで、同じツリーをループして繰り返し結果を追加することです。このアプローチの問題は、明らかに時間がかかることです...特に、ディレクトリツリーが巨大になる可能性があることです。私が考えた別の解決策は、ディレクトリ ツリー全体を解析し、対応する作成日または変更日を含むファイル名パスを生成し、その「インデックス」ファイルを使用して最近の上位 10 ファイルを取得することです。ここではデータベースがおそらく役に立ちましたが、現時点ではオプションではありません。

これを達成するための最適な方法を知っている人はいますか?

[1] Python は、ディレクトリに保存されている最新の csv ファイルのファイルパス/ファイル名を返します
[2]ディレクトリの内容をすべて読み取ることなく、ディレクトリ内の最新のファイルを検索します

4

2 に答える 2

4

作成時間とファイル名を返すジェネレーター関数を作成し、heapqモジュールを使用して最新の「n」エントリをかなり効率的に追跡することができます-例:

import os
import heapq

def iterfiles(root):
    for base, dirs, files in os.walk(root):
        for filename in files:
            fullname = os.path.join(base, filename)
            yield os.stat(fullname).st_ctime, fullname

print heapq.nlargest(10, iterfiles('some path here'))

余談ですがIOError、ファイルを stat するためのアクセス許可が利用できない場合は、(yield の周りの try/except) を処理する必要がある場合があります。

于 2012-10-06T11:42:12.323 に答える
1
import os
import heapq

basedir = ???

files = (os.path.join(x[0], fn) for x in os.walk(basedir) for fn in x[2])
print heapq.nlargest(10, files, key=lambda x:os.stat(x).st_ctime)
于 2012-10-06T11:57:08.757 に答える