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 ...
El método de
append
se ha creado exactamente para eso (append
un elemento al final de una lista)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.
Está utilizando una pequeña asimetría del lenguaje Python ... para los objetos de la lista, escribir
a += b
no es lo mismo que escribira = 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 objetoa
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étodoextend
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.
En lugar de os.walk y os.path.walk incorporados, utilizo algo derivado de este fragmento de código que encontré sugerido en otra parte:
http://code.google.com/p/mylibs/source/browse/lib/Python/MyPyLib/DirectoryStatWalker.py
No lo volveré a pegar aquí, pero recorre los directorios de manera recursiva y es bastante eficiente y fácil de leer.
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