162 votes

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

Je veux être en mesure de répertorier uniquement les répertoires à l'intérieur de certains dossiers. Cela signifie que je ne veux pas les noms de fichiers listés, je ne veux plus des sous-dossiers.

Nous allons voir 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 les noms de fichiers listés. Je ne veux sous-dossiers tels que \Lib\malédictions. Essentiellement, ce que je veux travaille avec les éléments suivants:

>>> 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 ya 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.

239voto

Alex Coventry Points 11090
os.walk('.').next()[1]

158voto

Thomas Wouters Points 38811

Filtrez le résultat en utilisant os.path.isdir () (et utilisez os.path.join () pour obtenir le vrai chemin):

 >>> [ 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']
 

65voto

Colin Jensen Points 1555

Filtrez la liste en utilisant os.path.isdir pour détecter les répertoires.

 filter(os.path.isdir, os.listdir(os.getcwd()))
 

19voto

Mark Roddy Points 7568
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]

14voto

tzot Points 32224

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 fonction de moins, et il est aussi portable.

Donc, pour compléter la réponse, pour obtenir une liste de 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 des chemins d'accès complets, 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)
    ]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X