0

os.walk クラス内の特定のサブフォルダーにある特定のファイルをインデックス番号で取得できるかどうかを知りたいです。

また、ルート ディレクトリのサブディレクトリなど、os.walk 内の特定のレベルのサブディレクトリのみを一覧表示する方法も知りたいです。すべてのサブディレクトリを一覧表示でき、最初のレベルのサブディレクトリのリストが最初にグループ化されていることがわかりますが、ループを使用せずにそれらだけを除外する方法が見つかりません...

このようなものは(別の質問から適応)部分的に機能しますが、1つのレベルからフォルダーをフィルタリングする方法がわかりません:

dirs[:] = [d for d in dirs if re.match('anyname_\d{3}', d, flags=0)]

type コマンドを使用すると os.walk タプルが「リスト」として表示され、インデックス番号を使用しようとすると、ディクショナリ オブジェクトの不適切な使用を参照するエラーが発生します。よくわかりません。

ありがとう!

4

1 に答える 1

1

あなたが何をしたいのかは完全には明確ではありませんが、私はあなたがあなたが望むことをする方法を理解するのに十分なことをする例を提供することができます:「anyname」という名前の各ディレクトリにある3番目のファイルのパス名を印刷しますこれは、トップのちょうど2レベル下です。

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 2 and os.path.basename(dirpath) == "anyname":
        print(os.path.join(dirpath, filenames[2]))

walkをプルーニングして、2つ以上の深さのディレクトリを見ないようにすることで、これをはるかに効率的にすることができます。

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 2:
        if os.path.basename(dirpath) == "anyname":
            print(os.path.join(dirpath, filenames[2]))
        dirnames.clear()

または、さらに効率的ですが、もう少し複雑になりますが、「anyname」という名前ではないすべてのdepth-2ディレクトリを削除します。

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 1:
        dirnames[:] = ["anyname"] if "anyname" in dirnames else []
    elif depth == 2:
        print(os.path.join(dirpath, filenames[2]))
        dirnames.clear()
于 2013-02-14T00:29:27.680 に答える