web-dev-qa-db-ja.com

os.walkの下のディレクトリを掘ることなく

制限する方法os.walk私が提供するディレクトリ内のファイルのみを返すには?

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        for f in files:
            if os.path.splitext(f)[1] in whitelist:
                outputList.append(os.path.join(root, f))
            else:
                self._email_to_("ignore")
    return outputList
93
Setori

walklevel関数を使用します。

import os

def walklevel(some_dir, level=1):
    some_dir = some_dir.rstrip(os.path.sep)
    assert os.path.isdir(some_dir)
    num_sep = some_dir.count(os.path.sep)
    for root, dirs, files in os.walk(some_dir):
        yield root, dirs, files
        num_sep_this = root.count(os.path.sep)
        if num_sep + level <= num_sep_this:
            del dirs[:]

os.walkと同じように機能しますが、再帰の深さを示すlevelパラメーターを渡すことができます。

96
nosklo

Os.walkを使用しないでください。

例:

import os

root = "C:\\"
for item in os.listdir(root):
    if os.path.isfile(os.path.join(root, item)):
        print item
189
Yuval Adam

解決策は実際には非常に簡単だと思います。

つかいます

break

forループの最初の反復のみを行うには、よりエレガントな方法が必要です。

for root, dirs, files in os.walk(dir_name):
    for f in files:
        ...
        ...
    break
...

Os.walkを初めて呼び出すと、現在のディレクトリのチューリップが返され、次のループで次のディレクトリの内容が返されます。

元のスクリプトを取得し、単にbreakを追加します。

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        for f in files:
            if os.path.splitext(f)[1] in whitelist:
                outputList.append(os.path.join(root, f))
            else:
                self._email_to_("ignore")
        break
    return outputList
39
Pieter

listdirを使用することをお勧めします。 Python 2の質問に対する直接的な答えはroot, dirs, files = os.walk(dir_name).next()です。

同等のPython 3構文はroot, dirs, files = next(os.walk(dir_name))です

22
Alex Coventry

os.listdir() を使用すると、指定されたディレクトリ内の(ファイルとディレクトリの両方の)名前のリストを返します。ファイルとディレクトリを区別する必要がある場合は、各名前でos.stat()を呼び出します。

12
Greg Hewgill

最上位ディレクトリよりも複雑な要件がある場合(VCS dirsなどを無視する場合)、ディレクトリのリストを変更して、os.walkが再帰するのを防ぐこともできます。

すなわち:

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        dirs[:] = [d for d in dirs if is_good(d)]
        for f in files:
            do_stuff()

注-リストを再バインドするのではなく、リストを変更するように注意してください。明らかに、os.walkは外部の再バインドについては知りません。

9
Brian

listdirでも同じ考えですが、短いです:

[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
4
Oleg Gryb
for path, dirs, files in os.walk('.'):
    print path, dirs, files
    del dirs[:] # go only one level deep
4
masterxilo

私の2ペンスを投げ入れるような感じがしました。

baselevel = len(rootdir.split("\\"))
for subdirs, dirs, files in os.walk(rootdir):
    curlevel = len(subdirs.split("\\"))
    if curlevel <= baselevel + 1:
        [do stuff]
3
Matt R

Python 3では、私はこれを行うことができました:

import os
dir = "/path/to/files/"

#List all files immediately under this folder:
print ( next( os.walk(dir) )[2] )

#List all folders immediately under this folder:
print ( next( os.walk(dir) )[1] )
2
Jay Sheth

次のこともできます。

for path, subdirs, files in os.walk(dir_name):
    for name in files:
        if path == ".": #this will filter the files in the current directory
             #code here
1
Diana G

Python 3.5以降、 _os.scandir_ の代わりに _os.listdir_ を使用できます。 。文字列の代わりに、 DirEntry オブジェクトの反復子を返します。ドキュメントから:

scandir()の代わりにlistdir()を使用すると、オペレーティングシステムが提供する場合にDirEntryオブジェクトがこの情報を公開するため、ファイルタイプまたはファイル属性情報も必要とするコードのパフォーマンスが大幅に向上しますディレクトリをスキャンするとき。すべてのDirEntryメソッドはシステムコールを実行できますが、is_dir()およびis_file()は通常、シンボリックリンクのシステムコールのみを必要とします。 DirEntry.stat()は、Unixでは常にシステムコールを必要としますが、Windowsではシンボリックリンクに対してのみシステムコールを必要とします。

_DirEntry.name_を介してオブジェクトの名前にアクセスできます。これは_os.listdir_の出力と同等です。

0
ascripter

os.walkが検出するすべてのディレクトリのルートフォルダーが変更されます。ルート==ディレクトリかどうかを確認するソルバー

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        if root == dir_name: #This only meet parent folder
            for f in files:
                if os.path.splitext(f)[1] in whitelist:
                    outputList.append(os.path.join(root, f))
                else:
                    self._email_to_("ignore")
    return outputList
0
Pedro J. Sola

これは私がそれを解決した方法です

if recursive:
    items = os.walk(target_directory)
else:
    items = [next(os.walk(target_directory))]

...
0
Deifyed

除外リストを作成し、fnmatchを使用してディレクトリ構造をスキップし、プロセスを実行します

excludes= ['a\*\b', 'c\d\e']
for root, directories, files in os.walk('Start_Folder'):
    if not any(fnmatch.fnmatch(nf_root, pattern) for pattern in excludes):
        for root, directories, files in os.walk(nf_root):
            ....
            do the process
            ....

「含む」と同じ:

if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**):
0
Hamsavardhini

Alexの答えにわずかな変更がありますが、__next__()を使用しています。

print(next(os.walk('d:/'))[2])またはprint(os.walk('d:/').__next__()[2])

[2]root, dirs, filefileであり、他の回答で言及されている

0
Oleg

Listdirを使用すると問題が発生します。 os.path.isdir(identifier)は絶対パスでなければなりません。サブディレクトリを選択するには:

for dirname in os.listdir(rootdir):
  if os.path.isdir(os.path.join(rootdir, dirname)):
     print("I got a subdirectory: %s" % dirname)

別の方法は、os.path.join()なしでテストを行うためにディレクトリに変更することです。

0
Kemin Zhou

このスニペットを使用できます

for root, dirs, files in os.walk(directory):
    if level > 0:
        # do some stuff
    else:
        break
    level-=1
0

rangeと組み合わせたZipos.walkを単に使用しないのはなぜですか?最善の解決策ではありませんが、機能します。

たとえば、次のようなものです。

# your part before
for count, (root, dirs, files) in Zip(range(0, 1), os.walk(dir_name)):
    # logic stuff
# your later part

python 3。

また:breakは単純すぎます。 (@Pieterからの回答をご覧ください)

0
PiMathCLanguage