lenguaje - python tutorial
Excluyendo directorios en os.walk (2)
... una forma alternativa de excelente respuesta de @unutbu que se lee un poco más directamente, dado que la intención es excluir directorios, a costa de O (n ** 2) frente a O (n) tiempo.
(Se requiere hacer una copia de la lista de directorios con list(dirs)
para la ejecución correcta)
# exclude = set([...])
for root, dirs, files in os.walk(top, topdown=True):
[dirs.remove(d) for d in list(dirs) if d in exclude]
Estoy escribiendo un script que desciende a un árbol de directorios (usando os.walk ()) y luego visita cada archivo que coincida con cierta extensión de archivo. Sin embargo, dado que algunos de los árboles de directorio en los que se utilizará mi herramienta también contienen subdirectorios que a su vez contienen un montón de cosas inútiles (a los fines de este script), pensé que agregaría una opción para que el usuario especifique una lista de directorios para excluir de la travesía.
Esto es bastante fácil con os.walk (). Después de todo, depende de mí decidir si realmente quiero visitar los respectivos archivos / directorios cedidos por os.walk () o simplemente omitirlos. El problema es que si tengo, por ejemplo, un árbol de directorios como este:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
y quiero excluir inútilStuff y todos sus hijos, os.walk () seguirá descendiendo en todos los (potencialmente miles de) subdirectorios de inútilStuff , lo cual, huelga decirlo, ralentiza mucho las cosas. En un mundo ideal, podría decirle a os.walk () que ni siquiera se moleste en tener más hijos de inútil , pero que sepa que no hay forma de hacerlo (¿está?).
¿Alguien tiene alguna idea? Tal vez hay una biblioteca de terceros que ofrece algo así?
La modificación de los directorios os.walk
archivos y directorios (posteriores) visitados por os.walk
:
# exclude = set([...])
for root, dirs, files in os.walk(top, topdown=True):
dirs[:] = [d for d in dirs if d not in exclude]
De la ayuda (os.walk):
Cuando topdown es verdadero, la persona que llama puede modificar la lista de dirnames in situ (por ejemplo, mediante la asignación del o slice), y walk solo volverá a aparecer en los subdirectorios cuyos nombres permanecen en dirnames; esto se puede usar para podar la búsqueda ...