1

フォルダー内にあるファイルの数を知りたいです (特に、ここで違いが生じる場合は、Windows の共有ネットワーク フォルダー)。

私は今このコードを使用しています:

include os.path
def countFiles(path):
    return len([f for f in os.listdir(path)
                if os.path.isfile(os.path.join(path, f))])

フォルダにいくつかのファイルがある場合は問題なく動作しますが、多くのファイル (たとえば 4000) があるディレクトリでは著しく時間がかかります。私はこれを頻繁に実行しているため(ファイルは約15秒ごとに追加されています)、スローダウンは苦痛です.

私の特定のケースでは、サブフォルダーがないことがわかっているので、os.path.isfileチェックをスキップできますが、ソリューションを一般的なものにしたいと思います。率直に言って、os.path に # of files 関数が組み込まれていないことに驚いています。

4

1 に答える 1

9

フォルダ内にいくつのファイルがあるかを知るために、システム各エントリを列挙し、エントリがファイルかどうかを確認する必要があります。システムがファイルシステム イベント (fseventや などeventfd) を提供して状況がいつ変化したかを知らせない限り、これより速い方法はありません。

これらの操作は、ディスクベースのファイルシステムでは遅く (数十から数百マイクロ秒)、ネットワーク ドライブではさらに遅くなります。通常のファイル ブラウザでもかなり遅いことがわかります。最新の OS は、積極的なキャッシングによって速度低下に対処していますが、これには限界があります (特にネットワーク ファイルシステムの場合、キャッシュを最新に保つためのオーバーヘッドが、最初に操作を実行するコストを超える可能性があります)。

isfile高速化するために、ディレクトリに変換されないという前提で、既にチェックした名前の結果をキャッシュできます。これにより、多少の安全性を犠牲にして多くのチェックを省くことができますisfile(たとえば、誰かがファイルを削除して、同じ名前のフォルダーに置き換えた場合)。

于 2013-09-07T16:38:23.650 に答える