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.
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 ".
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d,o))]
Vous pouvez simplement utiliser glob.glob
from glob import glob
glob("/path/to/directory/*/")
N'oubliez pas le dernier /
après le *
.
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
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
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))
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)
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
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)
files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
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
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']
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.
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.
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]
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"
où <your_directory>
est le chemin d'accès au répertoire que vous souhaitez parcourir.
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))])
Cette réponse semblait ne pas exister déjà.
directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
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']
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
.
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/')])
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
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 ;")
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