os.walk sin cavar en directorios debajo

¿Cómo puedo limitar os.walk para que solo devuelva archivos en el directorio que lo proporcioné?

 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 

Utilice la función de 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[:] 

Funciona igual que os.walk , pero puede pasarle un parámetro de level que indica la profundidad de la recursión.

No uses os.walk.

Ejemplo:

 import os root = "C:\\" for item in os.listdir(root): if os.path.isfile(os.path.join(root, item)): print item 

Creo que la solución es en realidad muy simple.

utilizar

 break 

Para hacer solo la primera iteración del bucle for, debe haber una forma más elegante.

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

La primera vez que llama a os.walk, devuelve tulipanes para el directorio actual, luego en el siguiente bucle los contenidos del siguiente directorio.

Tomar guión original y simplemente añadir un descanso .

 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 sugerencia de usar listdir es buena. La respuesta directa a tu pregunta en Python 2 es root, dirs, files = os.walk(dir_name).next() .

La syntax de Python 3 equivalente es root, dirs, files = next(os.walk(dir_name))

Podría usar os.listdir() que devuelve una lista de nombres (para archivos y directorios) en un directorio determinado. Si necesita distinguir entre archivos y directorios, llame a os.stat() en cada nombre.

Si tiene requisitos más complejos que solo el directorio superior (p. Ej., Ignorar las direcciones VCS, etc.), también puede modificar la lista de directorios para evitar que os.walk se repita en ellos.

es decir:

 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() 

Nota: tenga cuidado de mutar la lista, en lugar de simplemente rehacerla. Obviamente os.walk no sabe acerca de la revinculación externa.

La misma idea con listdir , pero más corta:

 [f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))] 

Me sentí como tirar mis 2 peniques.

 baselevel = len(rootdir.split("\\")) for subdirs, dirs, files in os.walk(rootdir): curlevel = len(subdirs.split("\\")) if curlevel <= baselevel + 1: [do stuff] 

En Python 3, pude hacer esto:

 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 

También podrías hacer lo siguiente:

 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 

Así lo resolví.

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

Hay un retén cuando se usa listdir. El os.path.isdir (identificador) debe ser una ruta absoluta. Para elegir los subdirectorios que haces:

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

La alternativa es cambiar al directorio para realizar las pruebas sin os.path.join ().

Puedes usar este fragmento

 for root, dirs, files in os.walk(directory): if level > 0: # do some stuff else: break level-=1 

cree una lista de excluye, use fnmatch para omitir la estructura del directorio y hacer el proceso

 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 .... 

igual que para ‘incluye’:

 if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**): 

¿Por qué no usar simplemente un range y os.walk combinados con el zip ? No es la mejor solución, pero funcionaría también.

Por ejemplo como este:

 # your part before for count, (root, dirs, files) in zip(range(0, 1), os.walk(dir_name)): # logic stuff # your later part 

Funciona para mí en python 3.

También: un break es más simple por cierto. (Mira la respuesta de @Pieter)

Un ligero cambio en la respuesta de Alex, pero usando __next__() :

print(next(os.walk('d:/'))[2]) o print(os.walk('d:/').__next__()[2])

siendo [2] el file en root, dirs, file mencionado en otras respuestas