0

次のようなディレクトリ構造があります。

Dir1
Dir2
Dir3
Dir4
    L SubDir4.1
    L SubDir4.2
    L SubDir4.3

のすべての内容を含むファイルのリスト (絶対パスを含む) を生成したいが、内部Dirs1-3のみである。私がこれまでに持っているコードはSubDir4.2Dir4

import fnmatch
import os

for root, dirs, files in os.walk( '.' )
    if 'Dir4' in dirs:
        if not 'SubDir4.2' in 'Dir4':
            dirs.remove( 'Dir4' )
    for file in files
        print os.path.join( root, file )

SubDir4.2私の問題は、パスにないファイルを除外しようとする部分が、Dir4残したいものを含め、 内のすべてを除外していることです。私が望むことを行うには、上記をどのように修正すればよいですか?

更新 1 : 以下に多くのディレクトリがあることを追加する必要があるDir4ため、それらを除外リストに手動でリストすることは実用的なオプションではありません。SubDur4.2読み取り対象の唯一のサブディレクトリとして指定できるようにしたいと思いDir4ます。

更新 2 : 私の制御外の理由により、Python バージョン 2.4.3 にしかアクセスできません。

4

3 に答える 3

1

スニペットにいくつかのタイプミスがあります。私はこれを提案します:

import os

def any_p(iterable):
    for element in iterable:
        if element:
            return True
    return False

include_dirs = ['Dir4/SubDir4.2', 'Dir1/SubDir4.2', 'Dir3', 'Dir2'] # List all your included folder names in that


for root, dirs, files in os.walk( '.' ):
    dirs[:] = [d for d in dirs if any_p(d in os.path.join(root, q_inc) for q_inc in include_dirs)]

    for file in files:
        print file

編集: コメントによると、これを除外リストではなくインクルード リストに変更しました。

EDIT2: any_p (python バージョン < 2.5 の any() と同等の関数) を追加しました。

EDIT3bis: 他のフォルダーに「SubDir4.2」という同じ名前の他のサブフォルダーがある場合は、次を使用して場所を指定できます。

include_dirs = ['Dir4/SubDir4.2', 'Dir1/SubDir4.2']

Dir1/SubDir4.2 があるとします。

それらが多数ある場合は、fnmatch またはおそらく正規表現クエリを使用してこのアプローチを改良することをお勧めします。

于 2012-07-16T12:07:54.607 に答える
0

mstud のソリューションを変更して、探しているものを提供しました。

import os;

for root, dirs, files in os.walk('.'):
    # Split the root into its path parts
    tmp = root.split(os.path.sep)
    # If the lenth of the path is long enough to be your path AND
    # The second to last part of the path is Dir4 AND
    # The last part of the path is SubDir4.2 THEN
    # Stop processing this pass.
    if (len(tmp) > 2) and (tmp[-2] == 'Dir4') and (tmp[-1] != 'SubDir4.2'):
        continue
    # If we aren't in Dir4, print the file paths.
    if tmp[-1] != 'Dir4':
        for file in files:
            print os.path.join(root, file)

つまり、最初の「if」は、SubDir4.2 ではない Dir4 の下のディレクトリ コンテンツの出力をスキップします。2 番目の「if」は、Dir4 ディレクトリの内容の出力をスキップします。

于 2012-07-16T13:42:39.240 に答える
-1
for root, dirs, files in os.walk('.'):
    tmp = root.split(os.path.sep)
    if len(tmp)>2 and tmp[-2]=="Dir4" and tmp[-1]=="SubDir4.2":
        continue

    for file in files:
        print os.path.join(root, file)
于 2012-07-16T11:59:39.517 に答える