Pythonの現在のディレクトリにあるすべてのサブディレクトリのリストを返す方法はありますか?
私はあなたがファイルでこれを行うことができることを知っています、しかし私は代わりにディレクトリのリストを取得する必要があります。
あなたは直下のサブディレクトリを意味しますか、それともツリーの真下のすべてのディレクトリを意味しますか?
どちらにしても、これを行うには os.walk
を使用できます。
os.walk(directory)
各サブディレクトリにTupleを生成します。 3タプルの最初のエントリはディレクトリ名です。
[x[0] for x in os.walk(directory)]
再帰的にあなたにすべてのサブディレクトリを与えるべきです。
Tupleの2番目のエントリは最初の位置のエントリの子ディレクトリのリストなので、代わりにこれを使用できますが、それほど多くのことを節約することはできません。
しかし、あなたはただあなたに直接の子ディレクトリを与えるためにそれを使うことができます:
next(os.walk('.'))[1]
または os.listdir
および os.path.isdir
を使用して、すでに投稿されている他の解決策を参照してください。「 Pythonの直接のサブディレクトリをすべて取得する方法 」。
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d,o))]
glob.glob
を使うことができます
from glob import glob
glob("/path/to/directory/*/")
/
の後に続く*
を忘れないでください。
Os.path.join()を必要としないで直接フルパスを取得するので、上記よりもはるかに良いでしょう。 Python 3.5+ でこれを実行できます
subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ]
これはサブディレクトリへの完全なパスを与えます。サブディレクトリの名前だけが欲しい場合はf.name
の代わりにf.path
を使用してください。
サブディレクトリ内のすべてのサブディレクトリを見つける再帰的な解決策が必要な場合は、前に提案したようにwalkを使用してください。
現在のディレクトリの子ディレクトリだけが必要な場合は、os.listdir
とos.path.isdir
を組み合わせてください。
私はfilter( 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)
Python 2.7ではos.listdir(path)を使ってサブディレクトリ(とファイル)のリストを取得できます。
import os
os.listdir(path) # list of subdirectories and files
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と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
ヒントをありがとう、みんな。ソフトリンク(無限再帰)がディレクトリとして返されるという問題に遭遇しました。ソフトリンク?悪臭を放つようなソフトリンクは不要です。そう...
これは、ソフトリンクではなく、単にディレクトリをレンダリングしたものです。
>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
この質問にはかなり前に回答されていますが。 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
等.
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は、Python 2.7でも PyPiのpathlib2モジュールからも入手できます。
これは@Blair Conradの例に基づいた簡単な関数です。
import os
def get_subdirs(dir):
"Get a list of immediate subdirectories"
return next(os.walk(dir))[1]
def get_subfiles(dir):
"Get a list of immediate subfiles"
return next(os.walk(dir))[2]
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>
は、トラバースするディレクトリへのパスです。
フルパスとパスの説明は.
、..
、\\
、..\\..\\subfolder
などです。
import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
for x in os.walk(os.path.abspath(path))])
この答えはまだ存在していないようです。
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
を使用できます。 entry
オブジェクトの詳細については os.DirEntry を参照してください。
os.listdir()
に対してos.path.isdir
のようなフィルタ関数を使うfilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
ipython
にコピーして貼り付ける
import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
print(folders)
からの出力:
['folderA', 'folderB']
ファイルツリーの直下にあるすべてのサブディレクトリを一覧表示します。
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の新機能です。
この関数は、指定された親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 ;")
指定されたファイルパス内のすべてのサブディレクトリのリストを返す関数。ファイルツリー全体を検索します。
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