Me doy cuenta de que no se hizo en la pregunta, pero tuve un problema similar en el que quería excluir tanto los archivos ocultos como los archivos que comienzan con __
, específicamente __pycache__
directorios. Llegué a esta pregunta porque estaba tratando de averiguar por qué la comprensión de mi lista no estaba haciendo lo que esperaba. No estaba modificando la lista en su lugar con dirnames[:]
.
Creé una lista de prefijos que quería excluir y modifiqué los nombres de directorio en su lugar así:
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]
Mi caso de uso fue similar al de OP, excepto que quería devolver un recuento del número total de subdirectorios dentro de una carpeta determinada. En mi caso, quería omitir cualquier subdirectorio llamado .git
(así como cualquier carpeta que pueda estar anidada dentro de estos .git
carpetas).
En Python 3.6.7, descubrí que el enfoque de la respuesta aceptada no funcionaba:contaba todos los .git
carpeta y sus subcarpetas. Esto es lo que funcionó para mí:
num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
if '.git' in dirs:
dirs.remove('.git')
num_local_subdir += (len(dirs))
No, no hay opción para os.walk()
eso los saltará. Deberá hacerlo usted mismo (lo cual es bastante fácil):
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
Tenga en cuenta el dirs[:] =
asignación de rebanadas; os.walk
atraviesa recursivamente los subdirectorios enumerados en dirs
. Reemplazando los elementos de dirs
con aquellos que satisfacen un criterio (por ejemplo, directorios cuyos nombres no comienzan con .
), os.walk()
no visitará directorios que no cumplan con los criterios.
Esto solo funciona si mantienes el topdown
argumento de palabra clave para True
, de la documentación de os.walk()
:
Cuando topdown
es True
, la persona que llama puede modificar la lista de nombres de directorio en el lugar (quizás usando del
o asignación de sectores) y walk()
solo se repetirá en los subdirectorios cuyos nombres permanecen en dirnames; esto puede usarse para podar la búsqueda, imponer un orden específico de visita, o incluso para informar walk()
sobre los directorios que la persona que llama crea o cambia de nombre antes de reanudar walk()
de nuevo.