Comment lister uniquement les répertoires de premier niveau en Python?

je veux pouvoir lister seulement les répertoires à l'intérieur d'un dossier. Cela signifie que je ne veux pas de noms de fichiers listés, ni de sous-dossiers supplémentaires.

voyons si un exemple aide. Dans le répertoire courant, nous avons:

>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
 'Tools', 'w9xpopen.exe']

cependant, je ne veux pas de noms de fichiers. Je ne veux pas non plus de sous-dossiers comme Libcurses. Essentiellement, ce que je veux fonctionne avec ce qui suit:

>>> for root, dirnames, filenames in os.walk('.'):
...     print dirnames
...     break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']

cependant, je me demande si il y a un moyen plus simple d'atteindre les mêmes résultats. J'ai l'impression que l'utilisation de l'os.pied pour revenir au niveau supérieur est inefficace/trop.

91
demandé sur fuentesjr 2008-09-26 23:01:06

15 réponses

filtrer le résultat en utilisant os.chemin.isdir() (et utilisez os.chemin.join() pour obtenir le vrai chemin d'accès):

>>> [ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ]
['ctypes', 'distutils', 'encodings', 'lib-tk', 'config', 'idlelib', 'xml', 'bsddb', 'hotshot', 'logging', 'doc', 'test', 'compiler', 'curses', 'site-packages', 'email', 'sqlite3', 'lib-dynload', 'wsgiref', 'plat-linux2', 'plat-mac']
82
répondu Thomas Wouters 2008-09-26 19:06:57
os.walk('.').next()[1]

ou avec utilisation de Python 3

next(os.walk('.'))[1]

comme @Andre Soares l'a dit dans le commentaire ci-dessous.

138
répondu Alex Coventry 2017-10-05 01:11:50

filtrer la liste en utilisant os.chemin.isdir pour détecter les répertoires.

filter(os.path.isdir, os.listdir(os.getcwd()))
38
répondu Colin Jensen 2012-08-29 13:59:52
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]
11
répondu Mark Roddy 2014-08-03 08:20:29

notez qu'au lieu de faire os.listdir(os.getcwd()) , il est préférable de faire os.listdir(os.path.curdir) . Un appel de moins et c'est aussi portable.

ainsi, pour compléter la réponse, pour obtenir une liste des répertoires dans un dossier:

def listdirs(folder):
    return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]

si vous préférez les noms de chemins complets, alors utilisez cette fonction:

def listdirs(folder):
    return [
        d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
        if os.path.isdir(d)
    ]
10
répondu tzot 2008-09-27 02:11:40

juste pour ajouter cela en utilisant os.listdir () ne prend pas "beaucoup de traitement vs un os très simple.marche.)(suivant()[1]" . C'est à cause d'os.marche() utilise le système d'exploitation.listdir() en interne. En fait, si vous les testez ensemble:

>>>> import timeit
>>>> timeit.timeit("os.walk('.').next()[1]", "import os", number=10000)
1.1215229034423828
>>>> timeit.timeit("[ name for name in os.listdir('.') if os.path.isdir(os.path.join('.', name)) ]", "import os", number=10000)
1.0592019557952881

Le filtrage de l'os.listdir() est très légèrement plus rapide.

8
répondu foz 2013-01-17 11:57:25

une façon beaucoup plus simple et élégante est d'utiliser ceci:

 import os
 dir_list = os.walk('.').next()[1]
 print dir_list

exécutez ce script dans le même dossier pour lequel vous voulez des noms de dossiers.Il vous donnera exactement le nom des dossiers immédiats seulement (cela aussi sans le chemin complet des dossiers).

6
répondu manty 2014-10-13 11:26:42

cela semble fonctionner aussi (au moins sur linux):

import glob, os
glob.glob('*' + os.path.sep)
5
répondu Travis 2016-07-06 04:54:49

étant un internaute novice, Je ne peux pas encore commenter directement, mais voici une petite correction que je voudrais ajouter à la partie suivante de la réponse de ΤΖΩΤΖΙΟΥ :

si vous préférez les noms de chemins complets, alors utilisez cette fonction:

def listdirs(folder):  
  return [
    d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
    if os.path.isdir(d)
]

pour ceux qui sont encore sur python < 2.4 : la construction intérieure doit être une liste au lieu d'un tuple et devrait donc lire comme ceci:

def listdirs(folder):  
  return [
    d for d in [os.path.join(folder, d1) for d1 in os.listdir(folder)]
    if os.path.isdir(d)
  ]

sinon on obtient une erreur de syntaxe.

2
répondu antiplex 2017-05-23 12:10:05
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]
1
répondu Moe 2008-09-26 19:05:26

pour une liste de noms de chemins complets, je préfère cette version aux autres solutions ici:

def listdirs(dir):
    return [os.path.join(os.path.join(dir, x)) for x in os.listdir(dir) 
        if os.path.isdir(os.path.join(dir, x))]
1
répondu Malius Arth 2017-05-23 10:31:26
scanDir = "abc"
directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]
1
répondu nvd 2017-09-18 16:13:12

comme ça?

>>> [chemin pour chemin dans l'os.listdir (os.getcwd()) si os.chemin.isdir(chemin de)]

0
répondu Kirk Strauser 2008-09-26 19:05:26

une option plus sûre qui n'échoue pas quand il n'y a pas de répertoire.

def listdirs(folder):
    if os.path.exists(folder):
         return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
    else:
         return []
0
répondu Alexey Gavrilov 2017-07-21 08:01:34
-- This will exclude files and traverse through 1 level of sub folders in the root

def list_files(dir):
    List = []
    filterstr = ' '
    for root, dirs, files in os.walk(dir, topdown = True):
        #r.append(root)
        if (root == dir):
            pass
        elif filterstr in root:
            #filterstr = ' '
            pass
        else:
            filterstr = root
            #print(root)
            for name in files:
                print(root)
                print(dirs)
                List.append(os.path.join(root,name))
            #print(os.path.join(root,name),"\n")
                print(List,"\n")

    return List
-1
répondu venkata maddineni 2018-02-26 23:25:35