python file os.walk

python - os.walk sin profundizar en los directorios a continuación



file (15)

¿Cómo limito os.walk a solo devolver archivos en el directorio que proporciono?

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


Así es como lo resolví

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


Creo que la solución es realmente muy simple.

utilizar

break

solo para hacer la primera iteración del bucle for, debe haber una manera 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 ciclo, el contenido del siguiente directorio.

Tome la secuencia de comandos original y simplemente agregue 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


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


Hay una trampa al usar 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 hacer las pruebas sin el os.path.join ().


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


La sugerencia de usar listdir es buena. La respuesta directa a su pregunta es root, dirs, files = os.walk(dir_name).next()


Me sentí como si arrojara 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]


No use os.walk.

Ejemplo:

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


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


Puedes usar este fragmento

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


Si tiene requisitos más complejos que solo el directorio superior (p. Ej., Ignore los directorios de VCS, etc.), también puede modificar la lista de directorios para evitar que os.walk recursive a través de 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 volver a vincularla. Obviamente, os.walk no sabe acerca de la reenlace externa.


También podría 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


Use la función 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 indique qué tan profunda será la recursión.


crea una lista de exclusiones, usa 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 ....

lo mismo que para ''incluye'':

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


for path, dirs, files in os.walk(''.''): print path, dirs, files del dirs[:] # go only one level deep