Je veux pouvoir lister uniquement les répertoires dans un dossier. Cela signifie que je ne veux pas que les noms de fichiers soient répertoriés, ni que je ne veux pas 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 que les noms de fichiers soient répertoriés. Je ne veux pas non plus de sous-dossiers tels que \ Lib \ curses. Essentiellement, ce que je veux fonctionne 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 s'il existe un moyen plus simple d'obtenir les mêmes résultats. J'ai l'impression qu'utiliser os.walk uniquement pour retourner le niveau supérieur est inefficace / trop.
la source
os.walk
Utiliser
os.walk
avecnext
la fonction d'élément:Pour Python <= 2.5, utilisez:
Comment ça marche
os.walk
est un générateur et l'appelnext
obtiendra le premier résultat sous la forme d'un 3-tuple (dirpath, dirnames, filenames). Ainsi, l'[1]
index ne renvoie que ledirnames
de ce tuple.la source
DIRNAMES=1
et ensuitenext()[DIRNAMES]
pour le rendre plus facile à comprendre pour les futurs responsables du code.os.walk( os.path.join(mypath,'.')).next()[1]
sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
Filtrez la liste à l'aide de os.path.isdir pour détecter les répertoires.
la source
os.listdir
renvoie un nom de fichier / dossier, transmis àos.path.isdir
, mais ce dernier a besoin d'un chemin complet.timeit(os.walk(os.getcwd()).next()[1])
1000 loops, best of 3: 734 µs per loop
timeit(filter(os.path.isdir, os.listdir(os.getcwd())))
1000 loops, best of 3: 477 µs per loop
la source
Notez qu'au lieu de faire
os.listdir(os.getcwd())
, il est préférable de le faireos.listdir(os.path.curdir)
. Un appel de fonction en moins, et c'est aussi portable.Donc, pour compléter la réponse, pour obtenir une liste de répertoires dans un dossier:
Si vous préférez les chemins d'accès complets, utilisez cette fonction:
la source
Cela semble fonctionner aussi (au moins sous Linux):
la source
glob
. Cela peut vous faire économiser beaucoup de code, en particulier les itérations, et ressemble beaucoup à l'utilisation du terminal UNIX (ls
)Juste pour ajouter qu'utiliser os.listdir () ne "prend pas beaucoup de traitement par rapport à os.walk (). Next () [1]" très simple . C'est parce que os.walk () utilise os.listdir () en interne. En fait si vous les testez ensemble:
Le filtrage de os.listdir () est très légèrement plus rapide.
la source
scandir
paquet - est heureusement disponible pour Python 2.6 en tant que paquet installable sur PyPI. Il propose des remplacements pouros.walk
etos.listdir
qui sont beaucoup plus rapides.Une manière beaucoup plus simple et élégante est d'utiliser ceci:
Exécutez ce script dans le même dossier pour lequel vous voulez des noms de dossier.Il vous donnera exactement le nom des dossiers immédiats uniquement (cela aussi sans le chemin complet des dossiers).
la source
Utilisation de la compréhension de liste,
Je pense que c'est le moyen le plus simple
la source
étant un débutant ici, je ne peux pas encore commenter directement mais voici une petite correction que j'aimerais ajouter à la partie suivante de la réponse de ΤΖΩΤΖΙΟΥ :
pour ceux qui utilisent encore python <2.4 : la construction interne doit être une liste au lieu d'un tuple et doit donc se lire comme ceci:
sinon on obtient une erreur de syntaxe.
la source
la source
Pour une liste des noms de chemins complets, je préfère cette version aux autres solutions ici:
la source
la source
Une option plus sûre qui n'échoue pas lorsqu'il n'y a pas de répertoire.
la source
Ainsi?
la source
Python 3.4 a introduit le
pathlib
module dans la bibliothèque standard, qui fournit une approche orientée objet pour gérer les chemins du système de fichiers:la source
la source