Python: ejecutar script en todos los subdirectorios

Soy nuevo en Python y lo estoy usando para hacer un análisis de datos.

Mi problema es el siguiente: tengo un directorio con muchos subdirectorios, cada uno de los cuales contiene una gran cantidad de archivos de datos.

Ya escribí un script de Python que, cuando se ejecuta en uno de esos subdirectorios, realiza el análisis de datos y lo escribe en un archivo de salida. La secuencia de comandos incluye algunos comandos de shell que os.system() usando os.system() , por lo que debo “estar” en uno de los subdirectorios para que funcione.

¿Cómo puedo escribir una función que automáticamente:

  1. Se mueve al primer subdirectorio.
  2. Ejecuta el guion
  3. Vuelve al directorio principal y se mueve al siguiente subdirectorio.

Supongo que esto podría hacerse de alguna manera usando os.walk() pero no entendí realmente cómo funciona.

PD: Soy consciente de la existencia de este post pero no soluciona mi problema.

PPS Tal vez debería señalar que mi función no toma el nombre del directorio como argumento. En realidad no lleva ningún argumento.

Para cambiar tu directorio de trabajo en Python necesitas:

 os.chdir(your_path) 

A continuación, puede ejecutar su script de forma recursiva.

Código de ejemplo:

 import os directory_to_check = "your_dir" # Which directory do you want to start with? def my_function(directory): print("Listing: " + directory) print("\t-" + "\n\t-".join(os.listdir("."))) # List current working directory # Get all the subdirectories of directory_to_check recursively and store them in a list: directories = [os.path.abspath(x[0]) for x in os.walk(directory_to_check)] directories.remove(os.path.abspath(directory_to_check)) # If you don't want your main directory included for i in directories: os.chdir(i) # Change working Directory my_function(i) # Run your function 

No sé cómo funciona su script porque su pregunta es bastante general, por lo tanto, solo puedo dar una respuesta general …

Pero creo que lo que necesitas es:

  1. Obtén todos los subdirectorios y guárdalos usando os.walk
  2. Cambia tu directorio de trabajo con os.chdir

os.walk solo no funcionará

¡Espero que esto ayude! ¡Buena suerte!

os.walk debería funcionar perfectamente para lo que quieres hacer. Comience con este código y debería ver lo que necesita hacer:

 import os path = r'C:\mystartingpath' for (path, dirs, files) in os.walk(path): print "Path:", path print "\nDirs:" for d in dirs: print '\t'+d print "\nFiles:" for f in files: print '\t'+f print "----" 

Lo que hará este código es mostrarle que os.walk recorrerá todos los subdirectorios de su ruta de inicio elegida. Una vez en cada directorio, puede obtener la ruta completa a cada nombre de archivo concatenando la ruta y el nombre del archivo. Por ejemplo:

 path_to_intersting_file = path+'\\'+filename # (This assumes that you saved your filename into a variable called filename) 

Con la ruta completa a cada archivo, puede realizar su análisis mientras está en el ciclo os.walk for. Agregue su código de análisis para que el bucle for haga más que solo imprimir contenidos.

Esto se haría así.

 for dir in os.listdir(your_root_directory): yourFunction(dir) 

El método os.listdir devuelve la lista de directorios solo en el directorio raíz.

os.walk embargo, el método os.walk atraviesa recursivamente los directorios, lo que lo hace útil para otras cosas y os.listdir podría ser mejor.

Sin embargo, por el bien de completenes, aquí hay una opción de os.walk :

 for dir in next(os.walk(your_directory))[1]: yourFunction(dir) 

Observe que os.walk es un generador, de ahí la próxima llamada. La primera llamada siguiente, produce una raíz de tupla, dirs, archivos. Y la raíz en este caso es tu directorio. Solo está interesado en dirs: la lista de subdirectorios, por lo que indexa [1].

Si desea realizar una determinada acción para cada subcarpeta de una carpeta, una forma es escribir una función recursiva, procesando cada directorio de uno en uno. Espero que mi ejemplo ayude un poco: http://pastebin.com/8G7JzcQ2