2015-10-17 4 views
7

にos.walkの仕事を作る:私はこの順序で、次のことをやろうとしている非標準的な方法

使用os.walk()は、各ディレクトリをダウンします。
各ディレクトリはsubfoldersを持っていますが、私は最初subfolderで唯一興味があります。ディレクトリは次のようになります。

/home/RawData/SubFolder1/SubFolder2 

たとえば、次のようになります。 RawData2には、SubFolder1レベルで停止するフォルダが必要です。

os.walk()RawDataフォルダのすべてをダウンしているようですが、私はそれを止める方法がわかりません。私は他のルートのための変数のdirsを代入の組み合わせ、またはファイルの数を試してみたが、それは私が欲しいものを私に取得していないようだ -

以下、私がこれまでにしたものです。

+0

それはあなたが何を意味するか、あなたがより多くを説明できることは明らかではないのか? – Kasramvd

+0

さて、os.walk()はすべてのレベルのRawDataと関連するサブフォルダを通過します。私はそれだけではなく、1つのレベルに下がることに興味があります。たぶん別の機能がより適切でしょうか? –

+0

は多分[グロブ](https://docs.python.org/3.4/library/glob.html#module-glob)有用な代替だろうか? – swenzel

答えて

1

代わりにglobを使用することをおすすめします。グロブのヘルプとして

は説明します

glob(pathname) 
    Return a list of paths matching a pathname pattern. 

    The pattern may contain simple shell-style wildcards a la 
    fnmatch. However, unlike fnmatch, filenames starting with a 
    dot are special cases that are not matched by '*' and '?' 
    patterns. 

だから、あなたのパターンは私がはこのようなものになるだろうと思いますすべての最初のレベルのディレクトリ、次のとおりです。だから、

/root_path/*/sub_folder1/sub_folder2 

、あなたが開始しますあなたのルートで、その最初のレベルのすべてを取得し、次にsub_folder1/sub_folder2を探します。私はと思って、だと思います。

すべて一緒にそれを置くために:

from glob import glob 

dirs = glob('/root_path/*/sub_folder1/sub_folder2') 

# Then iterate for each path 
for i in dirs: 
    print(i) 
+0

問題は、複数の異なるフォルダを繰り返し処理するためには、sub_folder2が必要です。あなたの方法でそれができるかどうかわかりません。 –

+0

あなたが言っているのは、フィルタリングされたマッチのすべてのサブディレクトリを通過したいということです。したがって、/ root_path/*/sub1/sub2を除外した場合。次に、それらのそれぞれを取り出し、それらのパスにあるすべてのものについてそれぞれを繰り返す必要がありますか? – idjaw

1

を注意してください:os.walkのドキュメントは言う:

)が徒歩(のコンテニュー間の現在の作業ディレクトリを変更しないでください。徒歩()現在のディレクトリを変更せず、その呼び出し元がどちらか

ないので、あなたがwalkループでos.chdir("/home/RawData2/")を避けるべきであることを前提としていません。

あなたは簡単にtopdown=Trueを使用してdirsをクリアすることによって再帰しないwalkを求めることができます:

for root, dirs, files in os.walk("/home/RawData", True): 
    for rep in dirs: 
     make_path(os.join("/home/RawData2/", rep) 
     # add processing here 
    del dirs[] # tell walk not to recurse in any sub directory 
+0

私はこれを一瞬で試しています。それがどのように進むかを報告します。 –

+0

これは "SubFolder1"を生成しているので、これは優れていますが、SubFolder2レベルのすべてのフォルダも生成します。 –

+0

@ZR:私はそれをテストしたはずです。リストは変更可能なオブジェクトですが、 'l = []'は元のリストを変更するのではなく、参照ポイントを空のリストにするだけです。 'del l [:]'でなければなりません。編集された投稿 –

関連する問題