2012-06-12 13 views
9

El bucle para el archivo raíz, dir, en os.walk(startdir) funciona a través de estos pasos? raíz¿Entiendo os.walk verdad?

for root in os.walk(startdir) 
    for dir in root 
     for files in dir 
  1. get del directorio de inicio: C: \ dir1 \ directorio2 \ startdir

  2. obtener carpetas en C: \ dir1 \ directorio2 \ startdir y una lista de carpetas "listadir"

  3. volver
  4. obtener archivos en el primer elemento dirlist y devolver la lista de archivos "filelist" como el primer elemento de una lista de listas de archivos.

  5. pasar al segundo elemento en dirlist y devolver la lista de archivos en esta carpeta "filelist2" como el segundo elemento de una lista de listas de archivos. etc.

  6. pase al siguiente raíces en FolderTree y empezar a 2. etc.

derecho? ¿O simplemente tiene todas las raíces primero, luego todos los directorios en segundo lugar y todos los archivos en tercer lugar?

+1

¿Por qué recibí un menos 1 por eso? ¿Hice algo mal? – Baf

Respuesta

13

os.walk devuelve un generador, que crea una tupla de valores (CURRENT_PATH, directorios, archivos en CURRENT_PATH en CURRENT_PATH).

Cada vez que se llama al generador, seguirá cada directorio de forma recursiva hasta que no haya más subdirectorios disponibles desde el directorio inicial al que se llamó.

Como tal,

os.walk('C:\dir1\dir2\startdir').next()[0] # returns 'C:\dir1\dir2\startdir' 
os.walk('C:\dir1\dir2\startdir').next()[1] # returns all the dirs in 'C:\dir1\dir2\startdir' 
os.walk('C:\dir1\dir2\startdir').next()[2] # returns all the files in 'C:\dir1\dir2\startdir' 

Así

import os.path 
.... 
for path, directories, files in os.walk('C:\dir1\dir2\startdir'): 
    if file in files: 
      print 'found %s' % os.path.join(path, file) 

o esta

def search_file(directory = None, file = None): 
    assert os.path.isdir(directory) 
    for cur_path, directories, files in os.walk(directory): 
     if file in files: 
      return os.path.join(directory, cur_path, file) 
    return None 

o si desea buscar el archivo usted puede hacer esto:

import os 
def search_file(directory = None, file = None): 
    assert os.path.isdir(directory) 
    current_path, directories, files = os.walk(directory).next() 
    if file in files: 
     return os.path.join(directory, file) 
    elif directories == '': 
     return None 
    else: 
     for new_directory in directories: 
      result = search_file(directory = os.path.join(directory, new_directory), file = file) 
      if result: 
       return result 
     return None 
+0

me gusta la solución os.path, ¿entonces os.path siempre se corresponderá con el directorio en el que se encuentra os.walk durante esa iteración? – Baf

+0

thx también samir! – Baf

+0

Por cierto, todas las respuestas anteriores valen una etiqueta de respuesta, ¡pero solo puedo etiquetar una de las publicaciones como respuesta! malo, o hay una forma de etiquetar varias publicaciones como respuesta? – Baf

2

os.walk funciona de forma un poco diferente a la anterior. Básicamente, devuelve tuplas de (ruta, directorios, archivos). Para ver esto, intente lo siguiente:

import pprint 
import os 
pp=pprint.PrettyPrinter(indent=4) 
for dir_tuple in os.walk("/root"): 
    pp.pprint(dir_tuple) 

... verá que cada iteración del bucle imprimirá un nombre de directorio, una lista de los nombres de los directorios de inmediato dentro de ese directorio, y otra lista de todos los archivos dentro de ese directorio. os.walk luego ingresará a cada directorio en la lista de subdirectorios y hará lo mismo, hasta que todos los subdirectorios de la raíz original hayan sido atravesados. Puede ser útil aprender un poco sobre la recursividad para entender cómo funciona esto.

+0

¡Muchas gracias, Alex! – Baf

+0

ima da recursión una lectura. Entonces, en el ciclo for, hago sobre los elementos de la tupla, si uso una declaración if para buscar archivos, solo comprobará la declaración – Baf

+0

, también esta nota es bastante clara ¡gracias por eso! – Baf

3

Aquí hay un pequeño ejemplo de cómo funciona os.walk() junto con algunas explicaciones usando algunas funciones de os.

en primer lugar que os.walk() vuelve tres artículos, el directorio raíz, una lista de directorios (dirs) inmediatamente por debajo de la raíz actual y una lista de archivos que se encuentran en esos directorios. El documentation le dará más información.

dirs contendrá una lista de directorios justo debajo de la raíz, y los archivos contendrán una lista de todos los archivos encontrados en esos directorios. En la siguiente iteración, cada directorio de aquellos en la lista anterior dirs asumirá el rol de root por turno y la búsqueda continuará desde allí, bajando un nivel solo después de que se haya buscado el nivel actual.

Un ejemplo de código: Esto buscará, contará e imprimirá los nombres de los archivos .jpg y .gif debajo del directorio de búsqueda especificado (su raíz). También hace uso de la función os.path.splitext() para separar la base del archivo de su extensión y la función os.path.join() para darle el nombre completo, incluida la ruta de acceso de los archivos de imagen encontrados.

import os 

searchdir = r'C:\your_root_dir' # your search starts in this directory (your root) 

count = 0 
for root, dirs, files in os.walk(searchdir): 
    for name in files: 
     (base, ext) = os.path.splitext(name) # split base and extension 
     if ext in ('.jpg', '.gif'):   # check the extension 
      count += 1 
      full_name = os.path.join(root, name) # create full path 
      print(full_name) 

print('\ntotal number of .jpg and .gif files found: %d' % count) 
+0

thx levon muy completo! usted stackoverflow chicos rock! – Baf

+3

Solo en caso de que alguien más tropiece con esto después de realizar una búsqueda de os.walk y "amplitud de primer plano": la información anterior es incorrecta. os.walk (al menos en Python 2.6 y 2.7) realiza un recorrido en profundidad, NO un recorrido transversal en amplitud. El orden exacto en el que se producen los elementos depende del parámetro de arriba hacia abajo; si topdown es verdadero (predeterminado), entonces realiza un recorrido de profundidad previa de pedido (https://en.wikipedia.org/wiki/File: Sorted_binary_tree_preorder.svg), mientras que si es False, realiza un recorrido de profundidad posterior al pedido posterior (https://en.wikipedia.org/wiki/File:Sorted_binary_tree_postorder.svg). –

5

En palabras simples, os.walk() generará una tupla de ruta, carpetas, archivos presentes en una ruta determinada y seguirá atravesando las subcarpetas.

import os.path 
path=input(" enter the path\n") 
for path,subdir,files in os.walk(path): 
    for name in subdir: 
     print os.path.join(path,name) # will print path of directories 
    for name in files:  
     print os.path.join(path,name) # will print path of files 

esto va a generar caminos de todos los subdirectorios, archivos y archivos en los subdirectorios