web-dev-qa-db-fra.com

Obtenir une liste de tous les sous-répertoires du répertoire en cours

Existe-t-il un moyen de renvoyer une liste de tous les sous-répertoires du répertoire actuel en Python?

Je sais que vous pouvez le faire avec des fichiers, mais je dois plutôt obtenir la liste des répertoires.

433
Brad Zeis

Voulez-vous dire les sous-répertoires immédiats, ou tous les répertoires directement dans l'arborescence?

De toute façon, vous pouvez utiliser os.walk pour faire ceci:

_os.walk(directory)
_

donnera un tuple pour chaque sous-répertoire. La première entrée dans le 3-Tuple est un nom de répertoire, donc

_[x[0] for x in os.walk(directory)]
_

devrait vous donner tous les sous-répertoires, de manière récursive.

Notez que la deuxième entrée du tuple est la liste des répertoires enfants de l'entrée en première position. Vous pouvez donc l'utiliser à la place, mais cela ne vous épargnera probablement pas beaucoup.

Cependant, vous pouvez l'utiliser uniquement pour vous donner les répertoires enfants immédiats:

_next(os.walk('.'))[1]
_

Ou consultez les autres solutions déjà publiées en utilisant os.listdir et os.path.isdir , y compris celles sur " Comment obtenir toutes les informations immédiates sous-répertoires en Python ".

495
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))]
144
gahooa

Vous pouvez simplement utiliser glob.glob

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

N'oubliez pas le dernier / après le *.

117
Udit Bansal

Bien mieux que ce qui précède, car vous n'avez pas besoin de plusieurs os.path.join () et vous obtiendrez directement le chemin complet (si vous le souhaitez), vous pouvez le faire dans Python 3.5. +

subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ]    

Cela donnera le chemin complet au sous-répertoire. Si vous voulez seulement le nom du sous-répertoire, utilisez f.name au lieu de f.path

https://docs.python.org/3/library/os.html#os.scandir

62
user136036

Si vous avez besoin d’une solution récursive pour rechercher tous les sous-répertoires dans les sous-répertoires, utilisez walk tel que proposé précédemment.

Si vous avez seulement besoin des répertoires enfants du répertoire en cours, combinez os.listdir avec os.path.isdir

36
Eli Bendersky

Je préfère utiliser le filtre ( https://docs.python.org/2/library/functions.html#filter ), mais ce n’est qu’une question de goût.

d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
27
ericvm

Implémenté cela en utilisant 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)
23
Charith

Vous pouvez obtenir la liste des sous-répertoires (et fichiers) dans Python 2.7 en utilisant os.listdir (chemin)

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

Répertorier uniquement les répertoires

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)

Répertorier uniquement les fichiers du répertoire en cours

files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
13
NutJobb

Depuis que je suis tombé sur ce problème en utilisant Python 3.4 et les chemins UNC Windows, voici une variante pour cet environnement:

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 est une nouveauté dans Python 3.4 et facilite beaucoup l'utilisation des chemins sous différents systèmes d'exploitation: https://docs.python.org/3.4/library/pathlib.html

9
Marcus Schommler

Merci du conseil les gars. J'ai rencontré un problème avec les softlinks (récursion infinie) renvoyés sous forme de dir. Softlinks? Nous ne voulons pas de liens soft stinkin '! Alors...

Cela ne rend que les dirs, pas les softlinks:

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

Python 3.4 a introduit module pathlib dans la bibliothèque standard, qui fournit une approche orientée objet pour gérer les chemins du système de fichiers:

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 est également disponible sur Python 2.7 via le module pathlib2 sur PyPi.

8
joelostblom

Bien que cette question a reçu une réponse il y a longtemps. Je souhaite recommander l’utilisation du module pathlib car il s’agit d’un moyen robuste de travailler sous Windows et sous Unix.

Donc, pour obtenir tous les chemins dans un répertoire spécifique, y compris les sous-répertoires:

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

etc.

8
API

Voici quelques fonctions simples basées sur l'exemple de @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

En vous basant sur la solution d'Eli Bendersky, utilisez l'exemple suivant:

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> est le chemin d'accès au répertoire que vous souhaitez parcourir.

5
Blairg23

Avec le chemin complet et la comptabilisation du chemin étant ., .., \\, ..\\..\\subfolder, etc.:

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

Cette réponse semblait ne pas exister déjà.

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

Copier coller convivial dans ipython:

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

Sortie de print(folders):

['folderA', 'folderB']
4
Andrew Schreiber

J'ai eu une question similaire récemment, et j'ai découvert que la meilleure réponse pour python 3.6 (comme l'utilisateur a été ajouté) consiste à utiliser os.scandir. Comme il semble qu'il n'y ait pas de solution pour l'utiliser, j'ajouterai la mienne. Tout d'abord, une solution non récursive qui répertorie uniquement les sous-répertoires directement sous le répertoire racine.

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

La version récursive ressemblerait à ceci:

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

gardez à l'esprit que entry.path utilise le chemin absolu du sous-répertoire. Si vous n'avez besoin que du nom du dossier, vous pouvez utiliser entry.name à la place. Reportez-vous à os.DirEntry pour plus d'informations sur l'objet entry.

3
Alberto A

utiliser une fonction de filtrage os.path.isdir sur os.listdir() quelque chose comme ceci filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])

1
oneLeggedChicken

Ceci listera tous les sous-répertoires tout au long de l’arborescence de fichiers.

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 est une nouveauté de la version 3.4

0
Yossarian42

Cette fonction, avec un parent donné directory itère sur tous ses directories récursivement et prints tout le filenames qu'elle trouve à l'intérieur. Trop utile.

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

Fonction permettant de renvoyer une liste de tous les sous-répertoires d’un chemin de fichier donné. Va chercher dans tout l'arborescence de fichiers.

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