2010-05-27 8 views
10

Tengo una carpeta llamada notas, naturalmente se clasificarán en carpetas, y dentro de esas carpetas también habrá subcarpetas para las subcategorías. Ahora mi problema es que tengo una función que camina a través de 3 niveles de subdirectorios:¿Cómo recorre los directorios con Python?

def obtainFiles(path): 
     list_of_files = {} 
     for element in os.listdir(path): 
      # if the element is an html file then.. 
      if element[-5:] == ".html": 
       list_of_files[element] = path + "/" + element 
      else: # element is a folder therefore a category 
       category = os.path.join(path, element) 
       # go through the category dir 
       for element_2 in os.listdir(category): 
        dir_level_2 = os.path.join(path,element + "/" + element_2) 
        if element_2[-5:] == ".html": 
         print "- found file: " + element_2 
         # add the file to the list of files 
         list_of_files[element_2] = dir_level_2 
        elif os.path.isdir(element_2): 
         subcategory = dir_level_2 
         # go through the subcategory dir 
         for element_3 in os.listdir(subcategory): 
          subcategory_path = subcategory + "/" + element_3 
         if subcategory_path[-5:] == ".html": 
          print "- found file: " + element_3 
          list_of_files[element_3] = subcategory_path 
         else: 
          for element_4 in os.listdir(subcategory_path): 
           print "- found file:" + element_4 

Tenga en cuenta que esto sigue siendo en gran medida un trabajo en progreso. Es muy feo en mis ojos ... Lo que trato de hacer aquí es revisar todas las carpetas y subcarpetas y poner todos los nombres de los archivos en un diccionario llamado "list_of_files", el nombre como "clave", y la ruta completa como "valor". La función aún no funciona del todo, pero se preguntaba cómo se usaría la función os.walk para hacer algo similar.

Gracias

+2

posible duplicado de [Listado de directorios en Python] (http://stackoverflow.com/questions/120656/directory-listing-in-python) – kennytm

+7

Para para responder a esta pregunta, primero debe comprender la recursión. Ver también: http://stackoverflow.com/questions/2922783/how-do-you-walk-through-the-directories-using-python –

Respuesta

36

Con base en sus breves descripciones, algo como esto debería funcionar:

list_of_files = {} 
for (dirpath, dirnames, filenames) in os.walk(path): 
    for filename in filenames: 
     if filename.endswith('.html'): 
      list_of_files[filename] = os.sep.join([dirpath, filename]) 
+1

.endswith() es una mejor solución para encontrar si una cadena termina con los caracteres. html –

1

usted puede hacer esto:

list_of_files = dict([ (file, os.sep.join((dir, file))) 
         for (dir,dirs,files) in os.walk(path) 
         for file in files 
         if file[-5:] == '.html' ]) 
0

una alternativa es utilizar el generador, sobre la base @ Código de ig0774

import os 
def walk_through_files(path, file_extension='.html'): 
    for (dirpath, dirnames, filenames) in os.walk(path): 
     for filename in filenames: 
     if filename.endswith(file_extension): 
      yield os.path.join(dirpath, filename) 

y luego

for fname in walk_through_files(): 
    print(fname) 
0

me he encontrado con esta pregunta varias veces, y ninguna de las respuestas satisfacerme - así creada a script for that. Pytohn es muy engorroso de usar cuando se trata de caminar a través de directorios.

Así es como se puede utilizar:

import file_walker 


for f in file_walker.walk("https://stackoverflow.com/a/path"): 
    print(f.name, f.full_path) # Name is without extension 
    if f.isDirectory: # Check if object is directory 
     for sub_f in f.walk(): # Easily walk on new levels 
      if sub_f.isFile: # Check if object is file (= !isDirectory) 
       print(sub_f.extension) # Print file extension 
       with sub_f.open("r") as open_f: # Easily open file 
        print(open_f.read()) 
Cuestiones relacionadas