web-dev-qa-db-ja.com

現在のディレクトリにあるすべてのサブディレクトリのリストを取得する

Pythonの現在のディレクトリにあるすべてのサブディレクトリのリストを返す方法はありますか?

私はあなたがファイルでこれを行うことができることを知っています、しかし私は代わりにディレクトリのリストを取得する必要があります。

400
Brad Zeis

あなたは直下のサブディレクトリを意味しますか、それともツリーの真下のすべてのディレクトリを意味しますか?

どちらにしても、これを行うには 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の直接のサブディレクトリをすべて取得する方法 」。

462
Blair Conrad
import os

d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]
137
gahooa

glob.globを使うことができます

from glob import glob
glob("/path/to/directory/*/")

/の後に続く*を忘れないでください。

108
Udit Bansal

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

46
user136036

サブディレクトリ内のすべてのサブディレクトリを見つける再帰的な解決策が必要な場合は、前に提案したようにwalkを使用してください。

現在のディレクトリの子ディレクトリだけが必要な場合は、os.listdiros.path.isdirを組み合わせてください。

36
Eli Bendersky

私は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))
27
ericvm

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)
22
Charith

Python 2.7ではos.listdir(path)を使ってサブディレクトリ(とファイル)のリストを取得できます。

import os
os.listdir(path)  # list of subdirectories and files
19
Oscar Martin

ディレクトリのみを一覧表示する

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)
12
NutJobb

私は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

9

ヒントをありがとう、みんな。ソフトリンク(無限再帰)がディレクトリとして返されるという問題に遭遇しました。ソフトリンク?悪臭を放つようなソフトリンクは不要です。そう...

これは、ソフトリンクではなく、単にディレクトリをレンダリングしたものです。

>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
8
KurtB

この質問にはかなり前に回答されていますが。 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

等.

7
API

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モジュールからも入手できます。

6
joelostblom

これは@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]
5
Brian Burns

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>は、トラバースするディレクトリへのパスです。

5
Blairg23

フルパスとパスの説明は...\\..\\..\\subfolderなどです。

import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])
5
DevPlayer

この答えはまだ存在していないようです。

directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
4
Andy

私は最近同様の質問をしました、そして私は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 を参照してください。

2
Alberto A

os.listdir()に対してos.path.isdirのようなフィルタ関数を使うfilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])

1

ipythonにコピーして貼り付ける

import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))

print(folders)からの出力:

['folderA', 'folderB']
1

ファイルツリーの直下にあるすべてのサブディレクトリを一覧表示します。

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の新機能です。

0
Yossarian42

この関数は、指定された親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 ;")

0
dbz

指定されたファイルパス内のすべてのサブディレクトリのリストを返す関数。ファイルツリー全体を検索します。

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
0
Matthew Ashley