OS.marcher sans fouiller dans les répertoires ci-dessous

Comment puis-je limiter os.walk à retourner uniquement les fichiers du 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
72
demandé sur Honest Abe 2008-10-23 14:03:59

15 réponses

utilisez la fonction walklevel .

import os

def walklevel(some_dir, level=1):
    some_dir = some_dir.rstrip(os.path.sep)
    assert os.path.isdir(some_dir)
    num_sep = some_dir.count(os.path.sep)
    for root, dirs, files in os.walk(some_dir):
        yield root, dirs, files
        num_sep_this = root.count(os.path.sep)
        if num_sep + level <= num_sep_this:
            del dirs[:]

il fonctionne comme os.walk , mais vous pouvez lui passer un paramètre level qui indique la profondeur de la récursion va aller.

78
répondu nosklo 2010-08-19 19:40:02

N'utilisez pas os.marche.

exemple:

import os

root = "C:\"
for item in os.listdir(root):
    if os.path.isfile(os.path.join(root, item)):
        print item
171
répondu Yuval Adam 2008-10-23 10:30:34

je pense que la solution est en fait très simple.

utiliser

break

pour ne faire que la première itération de la boucle for, il doit y avoir un moyen plus élégant.

for root, dirs, files in os.walk(dir_name):
    for f in files:
        ...
        ...
    break
...

La première fois que vous appelez os.à pied, il retourne tulipes pour le répertoire courant, puis sur la boucle suivante le contenu de la prochaine répertoire.

prendre le script original et juste ajouter un break .

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")
        break
    return outputList
29
répondu Pieter 2017-07-21 01:48:42

la suggestion d'utiliser listdir est bonne. La réponse directe à votre question Est root, dirs, files = os.walk(dir_name).next()

17
répondu Alex Coventry 2008-10-23 10:46:22

si vous avez des exigences plus complexes que le seul répertoire supérieur (par exemple, ignorer VCS DRS etc), Vous pouvez également modifier la liste des répertoires pour empêcher os.pied recursing à travers eux.

c'est à dire:

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        dirs[:] = [d for d in dirs if is_good(d)]
        for f in files:
            do_stuff()

Note - attention à muter la liste, plutôt que de simplement relier. Évidemment os.walk n'est pas au courant pour les rebonds externes.

9
répondu Brian 2011-10-29 09:59:01

vous pouvez utiliser os.listdir() qui retourne 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, appelez os.stat() sur chaque nom.

7
répondu Greg Hewgill 2008-10-23 10:06:02

la même idée avec listdir , mais plus court:

[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
4
répondu Oleg Gryb 2015-10-22 12:32:52

en Python 3, j'ai pu faire ceci:

import os
dir = "/path/to/files/"

#List all files immediately under this folder:
print ( next( os.walk(dir) )[2] )

#List all folders immediately under this folder:
print ( next( os.walk(dir) )[1] )
3
répondu Jay Sheth 2016-04-01 14:13:41
for path, dirs, files in os.walk('.'):
    print path, dirs, files
    del dirs[:] # go only one level deep
3
répondu masterxilo 2016-05-03 15:43:13

avait envie de jeter mes 2 pence.

baselevel = len(rootdir.split("\"))
for subdirs, dirs, files in os.walk(rootdir):
    curlevel = len(subdirs.split("\"))
    if curlevel <= baselevel + 1:
        [do stuff]
3
répondu Matt R 2017-06-02 08:14:38

vous pouvez aussi faire ce qui suit:

for path, subdirs, files in os.walk(dir_name):
    for name in files:
        if path == ".": #this will filter the files in the current directory
             #code here
1
répondu Diana G 2012-10-18 23:15:07

C'est comme ça que je l'ai résolu

if recursive:
    items = os.walk(target_directory)
else:
    items = [next(os.walk(target_directory))]

...
0
répondu Deifyed 2015-01-06 17:59:14

il y a une prise lors de l'utilisation de listdir. OS.chemin.isdir(identificateur) doit être un chemin absolu. Pour choisir les sous-répertoires vous faites:

for dirname in os.listdir(rootdir):
  if os.path.isdir(os.path.join(rootdir, dirname)):
     print("I got a subdirectory: %s" % dirname)

l'alternative est de changer de répertoire pour effectuer les tests sans le système d'exploitation.chemin.rejoindre.)(

0
répondu Kemin Zhou 2015-09-23 18:42:26

vous pouvez utiliser cet extrait

for root, dirs, files in os.walk(directory):
    if level > 0:
        # do some stuff
    else:
        break
    level-=1
0
répondu RousseauAlexandre 2016-08-24 08:56:51

créer une liste d'exclusions, utiliser fnmatch pour sauter la structure du répertoire et faire le processus

excludes= ['a\*\b', 'c\d\e']
for root, directories, files in os.walk('Start_Folder'):
    if not any(fnmatch.fnmatch(nf_root, pattern) for pattern in excludes):
        for root, directories, files in os.walk(nf_root):
            ....
            do the process
            ....

même que pour "y compris":

if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**):
0
répondu Hamsavardhini 2017-11-21 09:49:23