回答:
直下のサブディレクトリ、またはツリーのすぐ下のすべてのディレクトリを意味しますか?
どちらの方法でも、os.walk
これを行うために使用できます。
os.walk(directory)
各サブディレクトリのタプルを生成します。3タプルの最初のエントリはディレクトリ名なので、
[x[0] for x in os.walk(directory)]
すべてのサブディレクトリが再帰的に表示されます。
タプルの2番目のエントリは、最初の位置にあるエントリの子ディレクトリのリストであるため、代わりにこれを使用することもできますが、あまり節約できない可能性があります。
ただし、直接の子ディレクトリを提供するためにのみ使用できます。
next(os.walk('.'))[1]
または、「Pythonで直接のサブディレクトリをすべて取得する方法」のソリューションを含め、os.listdir
およびを使用してすでに投稿されている他のソリューションを参照してください。os.path.isdir
os.walk('.').next()[1]
またはos.walk('.').__next__()[1]
直接使用しないでください。代わりに、Python 2(ドキュメントを参照)とPython 3(ドキュメントを参照)のnext()
両方で利用可能な組み込み関数を使用してください。例:。next(os.walk('.'))[1]
os.walk('.').next()[1]
直接使用するのはなぜ悪いのですか?
os.walk
とos.listdir
+ os.path.isdir
ソリューション:私は(下の階層内のファイル数百万の)万個のサブディレクトリとディレクトリ上でテストおよびパフォーマンスの違いはごくわずかです。os.walk
:「10ループ、最高3:44.6ミリ秒/ループ」およびos.listdir
+ os.path.isdir
:「10ループ、最高3:45.1ミリ秒/ループ」
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d,o))]
os.path.join
オンにo
してフルパスを取得しない限り、これは機能しません。そうでない場合isdir(0)
は、常にfalseを返します
os.path.join
二回、あなたが最初に参加してから使用してリストをフィルタリングすることができますos.path.isdir
: filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
あなたはただ使うことができます glob.glob
from glob import glob
glob("/path/to/directory/*/")
末尾を忘れないでください/
後*
。
/
名前の末尾に
/
、フォルダの区切りであるためには、次の操作を行いますglob(os.path.join(path_to_directory, "*", ""))
recursive=True
上記よりはるかに優れています。いくつかのos.path.join()が必要なく、フルパスを直接(必要に応じて)取得できるため、Python 3.5以降でこれを実行できます。
subfolders = [ f.path for f in os.scandir(folder) if f.is_dir() ]
これにより、サブディレクトリへの完全なパスが提供されます。サブディレクトリの名前だけが必要な場合f.name
は、f.path
https://docs.python.org/3/library/os.html#os.scandir
少しOT:すべてのサブフォルダーおよび/またはすべてのファイルを再帰的に必要とする場合は、この関数を見てください。これはos.walk
&よりも高速でglob
、すべてのサブフォルダーとそれらの(サブ)サブフォルダー内のすべてのファイルのリストを返します。 https://stackoverflow.com/a/59803793/2441026
すべてのサブフォルダーのみを再帰的に必要とする場合:
def fast_scandir(dirname):
subfolders= [f.path for f in os.scandir(dirname) if f.is_dir()]
for dirname in list(subfolders):
subfolders.extend(fast_scandir(dirname))
return subfolders
すべてのサブフォルダとそのフルパスのリストを返します。これもos.walk
また、よりも速く、はるかに高速ですglob
。
すべての機能の分析
tl; dr:
- フォルダのすべての直接のサブディレクトリを取得する場合は、を使用しますos.scandir
。
- すべてのサブディレクトリ(ネストされたものも含む)を取得する場合はos.walk
、fast_scandir
上記の関数を使用するか、少し高速にしてください。
- os.walk
トップレベルのサブディレクトリのみに使用しないでくださいos.scandir
。
os.walk
ベースフォルダになります。したがって、サブディレクトリしか取得できません。を使用fu.pop(0)
して削除できます。結果:
os.scandir took 1 ms. Found dirs: 439
os.walk took 463 ms. Found dirs: 441 -> it found the nested one + base folder.
glob.glob took 20 ms. Found dirs: 439
pathlib.iterdir took 18 ms. Found dirs: 439
os.listdir took 18 ms. Found dirs: 439
W7x64、Python 3.8.1でテスト済み。
# -*- coding: utf-8 -*-
# Python 3
import time
import os
from glob import glob
from pathlib import Path
directory = r"<insert_folder>"
RUNS = 1
def run_os_walk():
a = time.time_ns()
for i in range(RUNS):
fu = [x[0] for x in os.walk(directory)]
print(f"os.walk\t\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_glob():
a = time.time_ns()
for i in range(RUNS):
fu = glob(directory + "/*/")
print(f"glob.glob\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_pathlib_iterdir():
a = time.time_ns()
for i in range(RUNS):
dirname = Path(directory)
fu = [f for f in dirname.iterdir() if f.is_dir()]
print(f"pathlib.iterdir\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_os_listdir():
a = time.time_ns()
for i in range(RUNS):
dirname = Path(directory)
fu = [os.path.join(directory, o) for o in os.listdir(directory) if os.path.isdir(os.path.join(directory, o))]
print(f"os.listdir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_os_scandir():
a = time.time_ns()
for i in range(RUNS):
fu = [f.path for f in os.scandir(directory) if f.is_dir()]
print(f"os.scandir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms.\tFound dirs: {len(fu)}")
if __name__ == '__main__':
run_os_scandir()
run_os_walk()
run_glob()
run_pathlib_iterdir()
run_os_listdir()
サブディレクトリ内のすべてのサブディレクトリを検索する再帰的なソリューションが必要な場合は、以前に提案されたようにウォークを使用します。
現在のディレクトリの子ディレクトリだけが必要な場合はos.listdir
、os.path.isdir
フィルター(https://docs.python.org/2/library/functions.html#filter)を使用することを好みますが、これは好みの問題です。
d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
python-os-walkを使用してこれを実装しました。(http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/)
import os
print("root prints out directories only from what you specified")
print("dirs prints out sub-directories from root")
print("files prints out all files from root and directories")
print("*" * 20)
for root, dirs, files in os.walk("/var/log"):
print(root)
print(dirs)
print(files)
os.listdir(path)を使用して、Python 2.7のサブディレクトリ(およびファイル)のリストを取得できます
import os
os.listdir(path) # list of subdirectories and files
os.listdir
ファイルを含むディレクトリの内容をリストすることに注意してください。
print("\nWe are listing out only the directories in current directory -")
directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir))
print(directories_in_curdir)
files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
Python 3.4は、pathlib
モジュールを標準ライブラリに導入しました。これにより、ファイルシステムパスを処理するためのオブジェクト指向アプローチが提供されます。
from pathlib import Path
p = Path('./')
# List comprehension
[f for f in p.iterdir() if f.is_dir()]
# The trailing slash to glob indicated directories
# This will also include the current directory '.'
list(p.glob('**/'))
Pathlibは、PyPiのpathlib2モジュールを介して Python 2.7でも利用できます。
for f in filter(Path.is_dir, p.iterdir()):
Python 3.4とWindows UNCパスを使用してこの問題を見つけたので、この環境のバリアントを次に示します。
from pathlib import WindowsPath
def SubDirPath (d):
return [f for f in d.iterdir() if f.is_dir()]
subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$'))
print(subdirs)
PathlibはPython 3.4の新機能であり、さまざまなOSでのパスの操作がはるかに簡単になります。https://docs.python.org/3.4/library/pathlib.html
この質問はずっと前に答えられましたが。を使用することをお勧めしますpathlib
これはWindowsおよびUnix OSで動作する堅牢な方法であるモジュールの。
したがって、サブディレクトリを含む特定のディレクトリのすべてのパスを取得するには:
from pathlib import Path
paths = list(Path('myhomefolder', 'folder').glob('**/*.txt'))
# all sorts of operations
file = paths[0]
file.name
file.stem
file.parent
file.suffix
等
ヒントをありがとう、みんな。私はソフトリンク(無限再帰)がdirsとして返されるという問題に遭遇しました。ソフトリンク?私たちは臭いのないソフトリンクを望んでいない!そう...
これにより、ソフトリンクではなく、dirsのみがレンダリングされました。
>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
[x[0] for x in inf]
それを調べることができるように、Pythonでは何と呼ばれていますか?
コピーフレンドリーipython
:
import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
からの出力print(folders)
:
['folderA', 'folderB']
x
によって作成されたリストから項目であるos.listdir(d)
のでlistdir
、彼が使用しているファイルとフォルダを返しますfilter
とコマンドをos.path.isdir
リストから任意のファイルをフィルタリングすることを。
これが私のやり方です。
import os
for x in os.listdir(os.getcwd()):
if os.path.isdir(x):
print(x)
Eli Benderskyのソリューションに基づいて、次の例を使用します。
import os
test_directory = <your_directory>
for child in os.listdir(test_directory):
test_path = os.path.join(test_directory, child)
if os.path.isdir(test_path):
print test_path
# Do stuff to the directory "test_path"
どこ<your_directory>
あなたがトラバースするディレクトリへのパスです。
この答えはまだ存在していないようです。
directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
私は最近同様の質問をしました、そしてpython 3.6(ユーザーhavlockが追加された)の最良の答えはを使用することであることがわかりましたos.scandir
。それを使った解決策はないようなので、自分で追加します。まず、ルートディレクトリの直下にあるサブディレクトリのみを一覧表示する非再帰的なソリューションです。
def get_dirlist(rootdir):
dirlist = []
with os.scandir(rootdir) as rit:
for entry in rit:
if not entry.name.startswith('.') and entry.is_dir():
dirlist.append(entry.path)
dirlist.sort() # Optional, in case you want sorted directory names
return dirlist
再帰バージョンは次のようになります。
def get_dirlist(rootdir):
dirlist = []
with os.scandir(rootdir) as rit:
for entry in rit:
if not entry.name.startswith('.') and entry.is_dir():
dirlist.append(entry.path)
dirlist += get_dirlist(entry.path)
dirlist.sort() # Optional, in case you want sorted directory names
return dirlist
entry.path
サブディレクトリへの絶対パスを使用することに注意してください。フォルダ名だけが必要な場合は、entry.name
代わりに使用できます。オブジェクトの詳細については、os.DirEntryを参照してくださいentry
。
このようなものにフィルター関数os.path.isdir
を使用しますos.listdir()
filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
これにより、ファイルツリーのすぐ下にすべてのサブディレクトリが一覧表示されます。
import pathlib
def list_dir(dir):
path = pathlib.Path(dir)
dir = []
try:
for item in path.iterdir():
if item.is_dir():
dir.append(item)
dir = dir + list_dir(item)
return dir
except FileNotFoundError:
print('Invalid directory')
pathlib
バージョン3.4の新機能
指定されたファイルパス内のすべてのサブディレクトリのリストを返す関数。ファイルツリー全体を検索します。
import os
def get_sub_directory_paths(start_directory, sub_directories):
"""
This method iterates through all subdirectory paths of a given
directory to collect all directory paths.
:param start_directory: The starting directory path.
:param sub_directories: A List that all subdirectory paths will be
stored to.
:return: A List of all sub-directory paths.
"""
for item in os.listdir(start_directory):
full_path = os.path.join(start_directory, item)
if os.path.isdir(full_path):
sub_directories.append(full_path)
# Recursive call to search through all subdirectories.
get_sub_directory_paths(full_path, sub_directories)
return sub_directories
os.walk()を使用してすべてのフォルダーのリストを取得できます
import os
path = os.getcwd()
pathObject = os.walk(path)
このpathObjectはオブジェクトであり、次の方法で配列を取得できます
arr = [x for x in pathObject]
arr is of type [('current directory', [array of folder in current directory], [files in current directory]),('subdirectory', [array of folder in subdirectory], [files in subdirectory]) ....]
すべてのサブディレクトリのリストを取得するには、arrを繰り返し処理し、中央の配列を出力します
for i in arr:
for j in i[1]:
print(j)
これにより、すべてのサブディレクトリが印刷されます。
すべてのファイルを取得するには:
for i in arr:
for j in i[2]:
print(i[0] + "/" + j)
この関数は、指定された親を使用directory
して、そのすべての関数をdirectories
再帰的に繰り返し、内部で見つかったprints
すべての関数を繰り返しfilenames
ます。あまりにも便利です。
import os
def printDirectoryFiles(directory):
for filename in os.listdir(directory):
full_path=os.path.join(directory, filename)
if not os.path.isdir(full_path):
print( full_path + "\n")
def checkFolders(directory):
dir_list = next(os.walk(directory))[1]
#print(dir_list)
for dir in dir_list:
print(dir)
checkFolders(directory +"/"+ dir)
printDirectoryFiles(directory)
main_dir="C:/Users/S0082448/Desktop/carpeta1"
checkFolders(main_dir)
input("Press enter to exit ;")