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.
python
directory
subdirectory
Brad Zeis
la source
la source
Réponses:
Voulez-vous dire des sous-répertoires immédiats ou tous les répertoires dans l'arborescence?
Dans les deux cas, vous pouvez utiliser
os.walk
pour cela:produira un tuple pour chaque sous-répertoire. La première entrée du triplet est un nom de répertoire, donc
devrait vous donner tous les sous-répertoires, récursivement.
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 il est peu probable que vous économisiez beaucoup.
Cependant, vous pouvez l'utiliser uniquement pour vous donner les répertoires enfants immédiats:
Ou consultez les autres solutions déjà publiées, en utilisant
os.listdir
etos.path.isdir
, y compris celles de " Comment obtenir tous les sous-répertoires immédiats en Python ".la source
os.walk('.').next()[1]
ouos.walk('.').__next__()[1]
directement. À la place, utilisez la fonction intégréenext()
, qui est disponible à la fois dans Python 2 (voir doc) et Python 3 (voir doc) . Par exemple:next(os.walk('.'))[1]
.os.walk('.').next()[1]
directement?iteraror.__next__()
s'agit d'une méthode interne et l'iterator.next()
utilisation doit être transférée vers la fonction intégréenext()
selon PEP-3114. Voir PEP-3114 qui a été approuvé en 2007.os.walk
etos.listdir
+os.path.isdir
: je viens de tester sur un répertoire avec 10 000 sous-répertoires (avec des millions de fichiers dans la hiérarchie ci-dessous) et les différences de performances sont négligeables.os.walk
: "10 boucles, meilleur de 3: 44,6 msec par boucle" etos.listdir
+os.path.isdir
: "10 boucles, meilleur de 3: 45,1 msec par boucle"la source
os.path.join
ono
pour obtenir le chemin complet, sinonisdir(0)
retournera toujours fauxos.path.join
deux fois, vous pouvez d'abord rejoindre puis filtrer la liste en utilisantos.path.isdir
:filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
Vous pouvez simplement utiliser
glob.glob
N'oubliez pas le suivi
/
après le*
.la source
/
dans les noms/
être le séparateur de dossiers, procédez commeglob(os.path.join(path_to_directory, "*", ""))
recursive=True
Beaucoup plus agréable que ci-dessus, car vous n'avez pas besoin de plusieurs os.path.join () et vous obtiendrez le chemin complet directement (si vous le souhaitez), vous pouvez le faire en Python 3.5 et supérieur.
Cela donnera le chemin d'accès complet au sous-répertoire. Si vous souhaitez uniquement utiliser le nom du sous-répertoire
f.name
au lieu def.path
https://docs.python.org/3/library/os.html#os.scandir
Légèrement OT: Si vous avez besoin de tous les sous-dossiers de manière récursive et / ou de tous les fichiers récursivement , jetez un œil à cette fonction, qui est plus rapide que
os.walk
&glob
et renverra une liste de tous les sous-dossiers ainsi que tous les fichiers à l'intérieur de ces (sous-) sous-dossiers: https://stackoverflow.com/a/59803793/2441026Si vous ne souhaitez que tous les sous-dossiers de manière récursive :
Renvoie une liste de tous les sous-dossiers avec leurs chemins d'accès complets. C'est encore plus rapide que
os.walk
et beaucoup plus rapide queglob
.Une analyse de toutes les fonctions
tl; dr:
- Si vous souhaitez obtenir tous les sous - répertoires immédiats pour une utilisation de dossier
os.scandir
.- Si vous souhaitez obtenir tous les sous-répertoires, même imbriqués , utilisez
os.walk
ou - un peu plus vite - lafast_scandir
fonction ci-dessus.- Ne jamais utiliser
os.walk
uniquement pour les sous-répertoires de niveau supérieur, car cela peut être des centaines (!) Fois plus lent queos.scandir
.os.walk
sera le dossier de base. Vous n'aurez donc pas que des sous-répertoires. Vous pouvez utiliserfu.pop(0)
pour le supprimer.Résultats :
Testé avec W7x64, Python 3.8.1.
la source
Si vous avez besoin d'une solution récursive qui trouvera tous les sous-répertoires dans les sous-répertoires, utilisez walk comme proposé précédemment.
Si vous n'avez besoin que des répertoires enfants du répertoire actuel, combinez-les
os.listdir
avecos.path.isdir
la source
Je préfère utiliser un filtre ( https://docs.python.org/2/library/functions.html#filter ), mais ce n'est qu'une question de goût.
la source
Implémenté cela en utilisant python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
la source
Vous pouvez obtenir la liste des sous-répertoires (et fichiers) dans Python 2.7 en utilisant os.listdir (chemin)
la source
os.listdir
liste des contenus du répertoire, y compris les fichiers.Répertorier uniquement les répertoires
Liste uniquement les fichiers dans le répertoire courant
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:Pathlib est également disponible sur Python 2.7 via le module pathlib2 sur PyPi.
la source
for f in filter(Path.is_dir, p.iterdir()):
Depuis que je suis tombé sur ce problème en utilisant les chemins Python 3.4 et Windows UNC, voici une variante pour cet environnement:
Pathlib est nouveau 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
la source
Bien qu'il soit répondu à cette question il y a longtemps. Je veux recommander d'utiliser le
pathlib
module car c'est un moyen robuste de travailler sur Windows et Unix OS.Donc, pour obtenir tous les chemins dans un répertoire spécifique, y compris les sous-répertoires:
etc.
la source
Merci du conseil les gars. J'ai rencontré un problème avec les liens logiciels (récursion infinie) renvoyés sous forme de répertoires. Liens souples? Nous ne voulons pas de liens mous puants! Donc...
Cela n'a rendu que les répertoires, pas les liens logiciels:
la source
[x[0] for x in inf]
s'appelle- t-on en python pour que je puisse le rechercher?Copier coller convivial dans
ipython
:Sortie de
print(folders)
:la source
x
est l'élément de la liste créé paros.listdir(d)
carlistdir
retournera les fichiers et dossiers avec lesquels il utilise lafilter
commandeos.path.isdir
pour filtrer tous les fichiers de la liste.Voilà comment je le fais.
la source
Voici quelques fonctions simples basées sur l'exemple de @Blair Conrad -
la source
En s'appuyant sur la solution d'Eli Bendersky, utilisez l'exemple suivant:
où
<your_directory>
est le chemin d'accès au répertoire que vous souhaitez parcourir.la source
Avec le chemin complet et comptable pour être de chemin
.
,..
,\\
,..\\..\\subfolder
, etc:la source
Cette réponse ne semblait pas déjà exister.
la source
J'ai eu une question similaire récemment, et j'ai découvert que la meilleure réponse pour python 3.6 (comme l'ajout d'un havlock utilisateur) est d'utiliser
os.scandir
. Puisqu'il semble qu'il n'y ait pas de solution en l'utilisant, 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.La version récursive ressemblerait à ceci:
gardez à l'esprit que vous
entry.path
utilisez le chemin absolu vers le sous-répertoire. Si vous n'avez besoin que du nom du dossier, vous pouvez utiliser à laentry.name
place. Reportez-vous à os.DirEntry pour plus de détails sur l'entry
objet.la source
utiliser une fonction de filtre
os.path.isdir
suros.listdir()
quelque chose comme çafilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
la source
Cela répertoriera tous les sous-répertoires dans l'arborescence des fichiers.
pathlib
est nouveau dans la version 3.4la source
Fonction pour renvoyer une liste de tous les sous-répertoires d'un chemin de fichier donné. Recherche dans toute l'arborescence des fichiers.
la source
nous pouvons obtenir la liste de tous les dossiers en utilisant os.walk ()
ce pathObject est un objet et nous pouvons obtenir un tableau par
Nous pouvons obtenir la liste de tous les sous-répertoires en parcourant l' arr et en imprimant le tableau du milieu
Cela imprimera tout le sous-répertoire.
Pour obtenir tous les fichiers:
la source
Cette fonction, avec un parent donné,
directory
itère sur tous ses élémentsdirectories
récursifs etprints
toutfilenames
ce qu'elle trouve à l'intérieur. Trop utile.la source
En rejoignant plusieurs solutions d'ici, voici ce que j'ai fini par utiliser:
la source