¿Cómo uso os.scandir () para devolver objetos DirEntry de forma recursiva en un árbol de directorios?

La función os.scandir(path) Python 3.5 devuelve objetos DirEntry ligeros que son muy útiles con información sobre archivos. Sin embargo, solo funciona para el camino inmediato que se le entrega. ¿Hay una manera de envolverlo en una función recursiva para que visite todos los subdirectorios debajo de la ruta dada?

Puede escanear recursivamente usando os.walk() , o si necesita objetos DirEntry o más control, escriba una función recursiva como scantree() continuación:

 try: from os import scandir except ImportError: from scandir import scandir # use scandir PyPI module on Python < 3.5 def scantree(path): """Recursively yield DirEntry objects for given directory.""" for entry in scandir(path): if entry.is_dir(follow_symlinks=False): yield from scantree(entry.path) # see below for Python 2.x else: yield entry if __name__ == '__main__': import sys for entry in scantree(sys.argv[1] if len(sys.argv) > 1 else '.'): print(entry.path) 

Notas:

  • Hay algunos ejemplos más en PEP 471 y en los documentos os.scandir () .
  • También puede agregar varias lógicas en el bucle for para omitir directorios o archivos que comienzan con '.' y ese tipo de cosa.
  • Por lo general, desea que follow_symlinks=false en las llamadas is_dir() en funciones recursivas como esta, para evitar los bucles de enlaces simbólicos.
  • En Python 2.x, reemplace el yield from línea con:

     for entry in scantree(entry.path): yield entry