2009-02-23 12 views
7

En Unix, todos los discos están expuestos como rutas en el sistema de archivos principal, por lo que os.walk('/') atravesaría, por ejemplo, /media/cdrom, así como el disco duro primario, y eso es indeseable para algunas aplicaciones.¿Cómo evito que os.walk de Python camine por puntos de montaje?

¿Cómo obtengo un os.walk que se mantiene en un solo dispositivo?

relacionadas:

+0

http://stackoverflow.com/questions/530645/is-there-a-way-to-determine-if-a-subdirectory-is-in-the-same-filesystem-from-pyth/530692#530692 – sykora

Respuesta

15

es de os.walk docs:

Cuando arriba hacia abajo es cierto, la persona que llama puede modificar la lista dirnames en el lugar (tal vez usando la asignación del o slice ), y walk() solo recurrirá a en los subdirectorios cuyos nombres permanecen en dirnames; esto se puede utiliza para podar la búsqueda

Así que algo como esto debería funcionar:

for root, dirnames, filenames in os.walk(...): 
    dirnames[:] = [ 
    dir for dir in dirnames 
    if not os.path.ismount(os.path.join(root, dir))] 
    ... 
+0

una respuesta brillantemente conciso. –

1

os.walk() no puede decir (por lo que yo sé) que es la navegación en una unidad diferente. Deberá verificarlo usted mismo.

Intente utilizar os.stat(), o comprobar que la variable raíz de os.walk() no /media

3

creo os.path.ismount podría funcionar para usted. Usted código podría ser algo como esto:

import os 
import os.path 
for root, dirs, files in os.walk('/'): 
    # Handle files. 
    dirs[:] = filter(lambda dir: not os.path.ismount(os.path.join(root, dir)), 
        dirs) 

También puede encontrar this answer útiles en la construcción de su solución.

* Gracias por los comentarios sobre el filtrado de dirs correctamente.

+0

La reasignación de directorios no funcionará. – Constantin

+0

Puede corregirlo cambiando su código a "dirs [:] = filter (...)" en su lugar, mutando la lista en lugar de reasignando – Brian

Cuestiones relacionadas