Recorrer un árbol de directorios en Python

Ya me picaba el gusanillo tras tanto examen y tanta gaita, así que esta vez ha tocado hacer una función que recorra los ficheros del directorio actual y de todos sus subdirectorios. Se basa en una función que mediante las funciones

os.stat()

para saber el tipo de fichero,

os.listdir()

para sacar el contenido de un directorio y una cola para guardar los ficheros que quedan por analizar.

Importamos las funciones necesarias de sus respectivos módulos:

from os import stat,listdir
from os.path import join
from stat import S_ISDIR,S_ISCHR,S_ISBLK,S_ISREG,S_ISFIFO,S_ISLNK,S_ISSOCK

Todas las

stat.S_ISxx()

se pueden sacar también de

os.stat.isXX()

, según la documentación del módulo stat –donde se puede encontrar una función similar a la implementada, pero con recursividad en vez de usar una cola.

Ahora la función (siento que la identación esté hecha con ___, pero es que el editor de WordPress no está hecho para meter código):

def walktree(origen):
____ficheros=[(None,origen),]

cargar la ruta inicial. El primer elemento de la tupla no sería necesario, no habría por qué usar una tupla. La estoy usando para un uso posterior que le quiero dar a esta función de recorrido de directorios.

____while ficheros:

mientras queden ficheros

____ ____ (parent,file)=ficheros.pop()

sacamos el siguiente fichero de la lista (ignorad

parent

)

____ ____print “Fichero: %s”%(file)
____ ____tipo=stat(file).st_mode

obtenemos mediante

os.stat()

el modo del fichero (lo que incluye los permisos, pero también el tipo). Según de qué tipo sea imprimiremos una cosa u otra en pantalla:

____ ____ if S_ISDIR(tipo):

Es un directorio: además de decir que es un directorio…

____ ____ ____ print “Directory”
____ ____ ____ for nuevo_fichero in listdir(file):

…debemos leer sus contenidos con

os.listdir()

e incluirlos en la lista ficheros. Nótese que

listdir()

no devuelve ni el directorio

‘.’

, ni

‘..’

, lo que nos evita ciclos que harían que el algoritmo no acabara nunca hasta agotar la memoria

____ ____ ____ ____ ficheros.insert(0,
____ ____ ____ ____ ____ (None,join(file,nuevo_fichero)))
____ ____ elif S_ISCHR(tipo):

y vamos comprobando otros tipos

____ ____ ____ print “Char. device”
____ ____ elif S_ISBLK(tipo):
____ ____ ____ print “Block device”
____ ____ elif S_ISREG(tipo):
____ ____ ____ print “Regular file”
____ ____ elif S_ISFIFO(tipo):
____ ____ ____ print “Named pipe”
____ ____ elif S_ISLNK(tipo):
____ ____ ____ print “Soft link”
____ ____ elif S_ISSOCK(tipo):
____ ____ ____ print “Socket”
if __name__==’__main__’:
____ walktree(‘.’)