制限する方法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
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
パラメーターを渡すことができます。
Os.walkを使用しないでください。
例:
import os
root = "C:\\"
for item in os.listdir(root):
if os.path.isfile(os.path.join(root, item)):
print item
解決策は実際には非常に簡単だと思います。
つかいます
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
listdir
を使用することをお勧めします。 Python 2の質問に対する直接的な答えはroot, dirs, files = os.walk(dir_name).next()
です。
同等のPython 3構文はroot, dirs, files = next(os.walk(dir_name))
です
os.listdir()
を使用すると、指定されたディレクトリ内の(ファイルとディレクトリの両方の)名前のリストを返します。ファイルとディレクトリを区別する必要がある場合は、各名前でos.stat()
を呼び出します。
最上位ディレクトリよりも複雑な要件がある場合(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は外部の再バインドについては知りません。
listdir
でも同じ考えですが、短いです:
[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
for path, dirs, files in os.walk('.'):
print path, dirs, files
del dirs[:] # go only one level deep
私の2ペンスを投げ入れるような感じがしました。
baselevel = len(rootdir.split("\\"))
for subdirs, dirs, files in os.walk(rootdir):
curlevel = len(subdirs.split("\\"))
if curlevel <= baselevel + 1:
[do stuff]
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] )
次のこともできます。
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
Python 3.5以降、 _os.scandir
_ の代わりに _os.listdir
_ を使用できます。 。文字列の代わりに、 DirEntry
オブジェクトの反復子を返します。ドキュメントから:
scandir()
の代わりにlistdir()
を使用すると、オペレーティングシステムが提供する場合にDirEntry
オブジェクトがこの情報を公開するため、ファイルタイプまたはファイル属性情報も必要とするコードのパフォーマンスが大幅に向上しますディレクトリをスキャンするとき。すべてのDirEntry
メソッドはシステムコールを実行できますが、is_dir()
およびis_file()
は通常、シンボリックリンクのシステムコールのみを必要とします。DirEntry.stat()
は、Unixでは常にシステムコールを必要としますが、Windowsではシンボリックリンクに対してのみシステムコールを必要とします。
_DirEntry.name
_を介してオブジェクトの名前にアクセスできます。これは_os.listdir
_の出力と同等です。
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
これは私がそれを解決した方法です
if recursive:
items = os.walk(target_directory)
else:
items = [next(os.walk(target_directory))]
...
除外リストを作成し、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**):
Alexの答えにわずかな変更がありますが、__next__()
を使用しています。
print(next(os.walk('d:/'))[2])
またはprint(os.walk('d:/').__next__()[2])
[2]
がroot, dirs, file
のfile
であり、他の回答で言及されている
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()なしでテストを行うためにディレクトリに変更することです。
このスニペットを使用できます
for root, dirs, files in os.walk(directory):
if level > 0:
# do some stuff
else:
break
level-=1
range
と組み合わせたZip
とos.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からの回答をご覧ください)