2009-02-23 8 views
7

In Unix tutti i dischi sono esposti come percorsi nel file system principale, quindi sarebbe os.walk('/') traverse, per esempio, /media/cdrom così come il disco rigido principale, e che è indesiderabile per alcune applicazioni.Come impedire a Python's os.walk di attraversare i punti di montaggio?

Come posso ottenere un os.walk che rimane su un singolo dispositivo?

correlati:

+0

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

risposta

15

è Da os.walk docs:

Quando topdown è vero, il chiamante può modificare l'elenco dirnames sul posto (magari usando l'assegnazione del o slice ), e walk() sarà solo recurse nelle sottodirectory i cui nomi rimangono nei nomi delle directory; questo può essere utilizzato per potare la ricerca

Quindi, qualcosa di simile dovrebbe funzionare:

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 risposta brillantemente concisa. –

1

os.walk() non può dire (per quanto ne so) che sta passando in rassegna una diversa unità. Dovrai controllarlo tu stesso.

Provare a utilizzare os.stat(), o il controllo che la variabile radice da os.walk() non /media

3

Penso os.path.ismount potrebbe funzionare per voi. È codice potrebbe essere simile a questa:

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) 

Si può anche trovare this answer utile nel costruire la vostra soluzione.

* Grazie per i commenti sul filtraggio dirs correttamente.

+0

La riassegnazione delle directory non funzionerà sicuramente. – Constantin

+0

È possibile risolvere il problema inserendo il codice in "dirs [:] = filtro (...)", invece di modificare l'elenco sul posto piuttosto che ricollegarlo – Brian

Problemi correlati