ver una recorrer nombre navegar manejo leer entre directorios directorio con como carpetas carpeta archivos archivo abrir python directory-walk

una - recorrer directorios en python



¿Cuál es la forma Python de caminar un árbol de directorios? (9)

Siento que asignar archivos y carpetas y hacer la parte + = [elemento] es un poco difícil. ¿Alguna sugerencia? Estoy usando Python 3.2

from os import * from os.path import * def dir_contents(path): contents = listdir(path) files = [] folders = [] for i, item in enumerate(contents): if isfile(contents[i]): files += [item] elif isdir(contents[i]): folders += [item] return files, folders


De hecho usando

items += [item]

es malo por muchas razones ...

  1. El método de append se ha creado exactamente para eso ( append un elemento al final de una lista)

  2. Está creando una lista temporal de un elemento para desecharla. Si bien la velocidad bruta no debería ser su primera preocupación cuando usa Python (de lo contrario, está usando el lenguaje incorrecto), perder la velocidad sin ninguna razón no parece ser lo correcto.

  3. Está utilizando una pequeña asimetría del lenguaje Python ... para los objetos de la lista, escribir a += b no es lo mismo que escribir a = a + b porque el primero modifica el objeto en su lugar, mientras que el segundo asigna una nueva lista y esto puede tener una semántica diferente si el objeto a también es accesible utilizando otras formas. En su código específico, esto no parece ser el caso, pero podría convertirse en un problema más adelante cuando otra persona (o usted mismo en unos años, es lo mismo) tendrá que modificar el código. Python incluso tiene un método extend con una sintaxis menos sutil que está específicamente diseñada para manejar el caso en el que desea modificar en su lugar un objeto de lista agregando al final los elementos de otra lista.

Además, como han señalado otros, parece que su código está intentando hacer lo que os.walk ya hace ...


Desde Python 3.4 hay un nuevo módulo pathlib. Así que para obtener todos los directorios y archivos que uno puede hacer:

from pathlib import Path dirs = [str(item) for item in Path(path).iterdir() if item.is_dir()] files = [str(item) for item in Path(path).iterdir() if item.is_file()]


Eche un vistazo a la función os.walk que devuelve la ruta junto con los directorios y archivos que contiene. Eso debería acortar considerablemente su solución.



Mientras buscaba en Google para la misma información, encontré esta pregunta.

Estoy publicando aquí el código más pequeño y claro que encontré en http://www.pythoncentral.io/how-to-traverse-a-directory-tree-in-python-guide-to-os-walk/ (en lugar de simplemente publicando la URL, en caso de rotura del enlace).

La página tiene información útil y también señala algunas otras páginas relevantes.

# Import the os module, for the os.walk function import os # Set the directory you want to start from rootDir = ''.'' for dirName, subdirList, fileList in os.walk(rootDir): print(''Found directory: %s'' % dirName) for fname in fileList: print(''/t%s'' % fname)


Si desea iterar recursivamente a través de todos los archivos, incluidos todos los archivos en las subcarpetas, creo que esta es la mejor manera.

import os def get_files(input): for fd, subfds, fns in os.walk(input): for fn in fns: yield os.path.join(fd, fn) ## now this will print all full paths for fn in get_files(fd): print(fn)


Todavía no he probado esto extensivamente, pero creo que esto expandirá el generador de os.walk , unirá los nombres de los archivos a todas las rutas de archivo y aplanará la lista resultante; Para dar una lista de archivos concretos en su ruta de búsqueda.

import itertools import os def find(input_path): return itertools.chain( *list( list(os.path.join(dirname, fname) for fname in files) for dirname, _, files in os.walk(input_path) ) )


Trate de usar el método de append .


def dir_contents(path): files,folders = [],[] for p in listdir(path): if isfile(p): files.append(p) else: folders.append(p) return files, folders