GNU/Linux >> Tutoriales Linux >  >> Linux

os.walk sin carpetas ocultas

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.


Linux
  1. Pwd sin enlaces simbólicos?

  2. ¿Fusionar carpetas con Mv?

  3. ¿MV sobrescribe el archivo de solo lectura sin preguntar?

  4. ¿Cambiar la contraseña raíz por Sudo, sin Su?

  5. Ansible:sudo sin contraseña

Ocultar carpetas y mostrar archivos ocultos en Ubuntu Linux [Truco para principiantes]

Cómo ver archivos y carpetas ocultos en Debian

Cómo ver archivos y carpetas ocultos en Ubuntu File Manager

Cómo comprimir una carpeta en Linux

Eliminar archivo sin preguntar

Bash:ls * sin agrupación de carpetas