Necesito un andador del sistema de archivos que podría ordenar ignorar los directorios que quiero dejar intactos, incluyendo todos los subdirectorios debajo de esa rama. El os.walk y os.path.walk simplemente no lo hacen.Un andador de Python que puede ignorar directorios
Respuesta
Hice, pues, esta casa de papeles función Walker:
import os
from os.path import join, isdir, islink, isfile
def mywalk(top, topdown=True, onerror=None, ignore_list=('.ignore',)):
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = os.listdir(top)
except Exception, err:
if onerror is not None:
onerror(err)
return
if len([1 for x in names if x in ignore_list]):
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
path = join(top, name)
if not islink(path):
for x in mywalk(path, topdown, onerror, ignore_list):
yield x
if not topdown:
yield top, dirs, nondirs
Es posible modificar el segundo elemento de valores de retorno os.walk
's in situ:
[...] la persona que llama puede modificar la lista de dirnames in situ (tal vez usando la asignación del o slice), y walk() solo recurrirá en los subdirectorios cuyos nombres permanecen en dirnames; esto puede ser usado para podar la búsqueda [...]
def fwalk(root, predicate):
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if predicate(r, d)]
yield dirpath, dirnames, filenames
Ahora, usted puede simplemente la mano en un predicado para los subdirectorios:
>>> ignore_list = [...]
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list))
En realidad, os.walk
puede hacer exactamente lo que quiere . Supongamos que tengo una lista (tal vez un conjunto) de directorios para ignorar en ignore
. Entonces esto debería funcionar:
def my_walk(top_dir, ignore):
for dirpath, dirnames, filenames in os.walk(top_dir):
dirnames[:] = [
dn for dn in dirnames
if os.path.join(dirpath, dn) not in ignore ]
yield dirpath, dirnames, filenames
Aquí está la mejor y más simple solución.
def walk(ignores):
global ignore
path = os.getcwd()
for root, dirs, files in os.walk(path):
for ignore in ignores:
if(ignore in dirs):
dirs.remove(ignore)
print root
print dirs
print files
walk(['.git', '.svn'])
Recuerde, si elimina el nombre de la carpeta de los directorios, no será explorado por os.walk.
Espero que ayude
- 1. CVS Ignorar directorios
- 2. Eclipse - Ignorar todos los directorios
- 3. SVN: Ignorar algunos directorios de manera recursiva
- 4. crear cremallera - ignorar estructura de directorios
- 5. ¿Puedo anular svn: ignorar para directorios individuales?
- 6. Git: ¿cómo ignorar los directorios ocultos?
- 7. ¿Puede Python doctest ignorar algunas líneas de salida?
- 8. no puede ignorar UserInterfaceState.xcuserstate
- 9. Python: Crear directorios
- 10. .hgignore sintaxis por ignorar solo archivos, no directorios?
- 11. python copytree with negated ignorar patrón
- 12. ¿Por qué Python no puede encontrar objetos compartidos que estén en directorios en sys.path?
- 13. ignorar/directorios podar oculta con GNU encuentran comando
- 14. git ignorar directorios con espacios en Mac OS X
- 15. ¿Cómo puedo ignorar los directorios .svn cuando uso sloccount?
- 16. ¿Puede Roxygen ignorar las funciones que no son del usuario?
- 17. Ignorar los archivos y directorios ocultos con obj-c
- 18. Encontrar directorios vacíos en Python
- 19. Python no reconoce directorios os.path.isdir()
- 20. ¿Cómo puedo ignorar todos los directorios, excepto uno que utiliza .hgignorar?
- 21. SVN Ignorar: cómo ignorar el contenido de un directorio
- 22. Git no puede ignorar .DS_Store definido en ignorar global
- 23. Python raw_input ignorar nueva línea
- 24. Python: Ignorar xmlns en elementtree.ElementTree
- 25. ¿Puede la autenticación de formularios ignorar returnUrl
- 26. Formateador de Eclipse: ¿puede ignorar las anotaciones?
- 27. Manejo de directorios con espacios Python subprocess.call()
- 28. ¿Tamaño máximo de un archivo que Python puede abrir?
- 29. Ignorar mayúsculas y minúsculas en Python Strings
- 30. ¿Cómo puede codificar ('ascii', 'ignorar') lanzar un UnicodeDecodeError?
De alguna manera me olvidé de la asignación de sectores, me tomé la libertad de agregar eso a mi código. –
Esta es la manera esperada de hacerlo, incluso lo dice en la documentación de os.path.walk(). – unwind
No, me refiero a la asignación de división completa como una forma de modificar toda la lista, no el hecho de que puede cambiarla. –