Comment limiter le os.walk
retour des fichiers dans le répertoire que je fournis?
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
for f in files:
if os.path.splitext(f)[1] in whitelist:
outputList.append(os.path.join(root, f))
else:
self._email_to_("ignore")
return outputList
files_with_full_path = [f.path for f in os.scandir(dir) if f.is_file()]
. Si vous n'avez besoin que des noms de fichiers, utilisez à laf.name
place def.path
. C'est la solution la plus rapide et beaucoup plus rapide que n'importe quelle autrewalk
oulistdir
, consultez stackoverflow.com/a/40347279/2441026 .Réponses:
Utilisez la
walklevel
fonction.Cela fonctionne exactement comme
os.walk
, mais vous pouvez lui passer unlevel
paramètre qui indique la profondeur de la récursivité.la source
dirs = []
etdirs = None
mais cela n'a pas fonctionné.map(dirs.remove, dirs)
a fonctionné, mais avec quelques messages indésirables «[Aucun]» imprimés. Alors, pourquoidel dirs[:]
précisément?topdown=False
dans os.walk. Voir le 4e paragraphe dans la documentation :Modifying dirnames when topdown is False has no effect on the behavior of the walk, because in bottom-up mode the directories in dirnames are generated before dirpath itself is generated.
dirs = []
etdirs = None
ne fonctionnera pas car ils créent simplement un nouvel objet indépendant et attribuent le nomdirs
. L'objet de liste d'origine doit être modifié sur place, pas le nomdirs
.N'utilisez pas os.walk.
Exemple:
la source
os.path.isfile
etos.path.isdir
vous permet de vous différencier. Je ne comprends pas, car ilos.path.isfile
est dans l'exemple de code depuis '08 et votre commentaire est de '16. C'est clairement la meilleure réponse, car vous n'avez pas l'intention de parcourir un répertoire, mais de le répertorier.walk
vous donnant immédiatement les listes séparées de répertoires et de fichiers..next()
) et elle est beaucoup plus proche de votre idée.os.scandir
fonction qui permet une interaction fichier-ou-répertoire-objet plus sophistiquée. Voir ma réponse ciJe pense que la solution est en fait très simple.
utilisation
pour ne faire que la première itération de la boucle for, il doit y avoir une manière plus élégante.
La première fois que vous appelez os.walk, il renvoie des tulipes pour le répertoire courant, puis lors de la boucle suivante, le contenu du répertoire suivant.
Prenez le script original et ajoutez simplement une pause .
la source
La suggestion à utiliser
listdir
est bonne. La réponse directe à votre question dans Python 2 estroot, dirs, files = os.walk(dir_name).next()
.La syntaxe Python 3 équivalente est
root, dirs, files = next(os.walk(dir_name))
la source
root, dirs, files = os.walk(dir_name).next()
me donneAttributeError: 'generator' object has no attribute 'next'
root, dirs, files = next(os.walk(dir_name))
et ensuite les variablesroot, dirs, files
ne correspondront qu'aux variables du générateur audir_name
niveau.Vous pouvez utiliser
os.listdir()
qui renvoie une liste de noms (pour les fichiers et les répertoires) dans un répertoire donné. Si vous avez besoin de faire la distinction entre les fichiers et les répertoires, appelezos.stat()
chaque nom.la source
Si vous avez des exigences plus complexes que le seul répertoire supérieur (par exemple, ignorer les répertoires VCS, etc.), vous pouvez également modifier la liste des répertoires pour empêcher os.walk de les parcourir.
c'est à dire:
Remarque - veillez à modifier la liste, plutôt que de simplement la relier. De toute évidence, os.walk ne connaît pas la reliure externe.
la source
la source
La même idée avec
listdir
, mais en plus court:la source
J'avais l'impression de jeter mes 2 pence.
la source
En Python 3, j'ai pu faire ceci:
la source
Depuis Python 3.5, vous pouvez utiliser à la
os.scandir
place deos.listdir
. Au lieu de chaînes, vous obtenez un itérateur d'DirEntry
objets en retour. À partir de la documentation:Vous pouvez accéder au nom de l'objet via
DirEntry.name
qui équivaut alors à la sortie deos.listdir
la source
scandir()
, car il est un beaucoup plus rapide quelistdir()
. Consultez les benchmarks ici: stackoverflow.com/a/40347279/2441026 .Vous pouvez également effectuer les opérations suivantes:
la source
Voilà comment je l'ai résolu
la source
Il y a un problème lors de l'utilisation de listdir. Le os.path.isdir (identificateur) doit être un chemin absolu. Pour choisir les sous-répertoires que vous faites:
L'alternative est de passer au répertoire pour faire les tests sans os.path.join ().
la source
Vous pouvez utiliser cet extrait
la source
créer une liste d'exclusions, utiliser fnmatch pour ignorer la structure du répertoire et effectuer le processus
idem pour «comprend»:
la source
Pourquoi ne pas simplement utiliser un
range
etos.walk
combiné avec lezip
? Ce n'est pas la meilleure solution, mais cela fonctionnerait aussi.Par exemple comme ceci:
Fonctionne pour moi sur python 3.
Aussi: A
break
est plus simple trop btw. (Regardez la réponse de @Pieter)la source
Un léger changement dans la réponse d'Alex, mais en utilisant
__next__()
:print(next(os.walk('d:/'))[2])
ouprint(os.walk('d:/').__next__()[2])
avec l'
[2]
étantfile
enroot, dirs, file
mentionné dans d' autres réponsesla source
le dossier racine change pour chaque répertoire trouvé par os.walk. Je résolve cela en vérifiant si le répertoire racine ==
la source
la source