2012-09-14 20 views

Respuesta

11

No hay nada que le impide la creación de su propia función:

import os 

def listfiles(folder): 
    for root, folders, files in os.walk(folder): 
     for filename in folders + files: 
      yield os.path.join(root, filename) 

Usted puede usarlo de esta manera:

for filename in listfiles('/etc/'): 
    print filename 
+0

Gracias! Solo quería asegurarme de que esta función no formara parte de la biblioteca estándar. –

+1

Ojalá existiera uno. Siempre puede editar 'os.py';) – Blender

+0

¡Buena solución! Pero 'find .' también enumera directorios. La solución es muy fácil sin embargo. :) –

1

O eso, o manualmente de manera recursiva con isdir()/isfile() y listdir() o puede utilizar subprocess.check_output() y llame find .. Bascialmente os.walk() es el nivel más alto, el nivel ligeramente inferior es la solución semi-manual basada en listdir() y si desea la misma salida find . le dará por alguna razón puede hacer una llamada al sistema con subprocess.

+0

+1 para 'os.walk()'. – Blender

0
import os 
path = "path/to/your/dir" 
for (path, dirs, files) in os.walk(path): 
    print files 

¿Es esta una exageración, o me estoy perdiendo algo?

+0

Tiene toda la razón. Parece mucho más difícil de lo que realmente es. –

4

os.walk() no es exagerado de ninguna manera. Puede generar la lista de archivos y directorios en un santiamén:

files = [os.path.join(dirpath, filename) 
    for (dirpath, dirs, files) in os.walk('.') 
    for filename in (dirs + files)] 

Usted puede convertir esto en un generador, con sólo el proceso de una sola ruta a la vez y seguro en la memoria.

+0

+1 para la solución más pitonica :) – kgr

1

También es posible usar el programa en sí find desde Python usando sh

import sh 
text_files = sh.find(".", "-iname", "*.txt") 
Cuestiones relacionadas