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
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.
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
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
la suggestion d'utiliser listdir
est bonne. La réponse directe à votre question Est root, dirs, files = os.walk(dir_name).next()
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.
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.
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))]
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] )
for path, dirs, files in os.walk('.'):
print path, dirs, files
del dirs[:] # go only one level deep
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]
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
C'est comme ça que je l'ai résolu
if recursive:
items = os.walk(target_directory)
else:
items = [next(os.walk(target_directory))]
...
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.)(
vous pouvez utiliser cet extrait
for root, dirs, files in os.walk(directory):
if level > 0:
# do some stuff
else:
break
level-=1
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**):