2009-03-01 15 views
7

Quando si utilizza il metodo os.listdir, è necessario indicare quale elemento nell'elenco risultante è una directory o solo un file.Come posso distinguere un file dalla directory in Python?

Ho riscontrato un problema quando ho dovuto esaminare tutte le directory in questo elenco e quindi aggiungere un file in ogni singola directory.

C'è un modo per scorrere questo elenco e rimuovere tutti i file da esso? Se non è possibile farlo con os.listdir, quale metodo dovrei usare invece?

Grazie.

risposta

16

Utilizzare os.path.isdir per filtrare le directory. Forse qualcosa di simile

dirs = filter(os.path.isdir, os.listdir('/path')) 
for dir in dirs: 
    # add your file 
+1

Grazie per la risposta rapida! Ho controllato l'aiuto (os.path) e ho scoperto che forse anche isfile (path) sarebbe stato utile. isdir (s) Restituisce true se il percorso si riferisce a una directory esistente. isfile (percorso) Verificare se un percorso è un file normale –

+0

Non dimenticare il test per se un file è un collegamento software: islink e ismount per se un file è il punto di montaggio per un dispositivo. –

+4

A testa a testa che 'listdir()' non restituisce i file e le directory del percorso specificato (''/ percorso'' nell'esempio) con percorsi assoluti, ma solo il nome file. E penso che 'isdir()'/'isfile()' etc controlli relativi alla directory di lavoro corrente, quindi 'filter()' potrebbe non funzionare a meno che non si trasformino i valori restituiti di 'listdir' in percorsi. – Parham

2

dirs = filtro (os.path.isdir, os.listdir ('/ path'))

Nota questo non funzionerà a meno che '/ percorso' è la directory di lavoro corrente. os.listdir() restituisce nomi foglia, quindi chiederai "os.path.isdir ('file.txt')", e se la directory corrente è altrove, guarderai il file 'file.txt' sbagliato.

os.path.join() deve essere utilizzato sull'output di os.listdir() per ottenere un nome file completo.

children= [os.path.join('/path', child) for child in os.listdir('/path')] 
directories= filter(os.path.isdir, children) 
+0

L'ho fatto in questo modo. dir = os.listdir (dir) i = len (dir) -1 mentre i> -1: se os.path.isfile (ODIR + '\\' + dir [i]): del dir [i] i = i-1 dove dir è la directory definita dall'utente. Funziona bene. –

+0

Hai dimenticato di menzionare: odir = dir # 'odir' sta per 'directory originale' Quindi 'odir' contiene la directory definita dall'utente, dopo che 'dir' è cambiato in una lista. Post scriptum C'è un modo per modificare i commenti? O_o –

+0

Li elimini e ri-post, facendo finta che non sia successo nulla :-) – bobince

7

Questo potrebbe essere più veloce:

current, dirs, files = os.walk('/path').next() 

L'elenco delle directory sarà nella variabile dirs.

+0

D'accordo!Lo proverò anche, grazie. –

+1

fantastico, molto bello metodo – Serg

Problemi correlati