2013-01-05 29 views
16

C'è un modo per elencare i file (non le directory) in una directory con Python? So che potrei usare os.listdir e un ciclo di os.path.isfile() s, ma se c'è qualcosa di più semplice (come una funzione os.path.listfilesindir o qualcosa del genere), probabilmente sarebbe meglio.Elenca solo i file in una directory?

+0

[related] (http://stackoverflow.com/q/6664205) – Tshepang

risposta

29

Questo è a simple generator expression:

files = (file for file in os.listdir(path) 
     if os.path.isfile(os.path.join(path, file))) 
for file in files: # You could shorten this to one line, but it runs on a bit. 
    ... 

Oppure si potrebbe fare una funzione di generatore, se si adatta meglio:

def files(path): 
    for file in os.listdir(path): 
     if os.path.isfile(os.path.join(path, file)): 
      yield file 

Poi basta:

for file in files(path): 
    ... 
+0

Perché ho ottenuto un downvote su questo? –

+0

il tuo dimenticato di aggiungere unire tra dirname e nome file – ayvango

+0

@ayvango Questo è solo un comportamento diverso - non c'era una chiamata per dare un percorso completo nella domanda, e questo funziona così com'è in un modo ben definito. –

1

Si potrebbe provare pathlib, che ha anche molte altre cose utili.

Pathlib è una libreria orientata agli oggetti per l'interazione con i percorsi del file system. Per ottenere i file nella directory corrente, si può fare:

from pathlib import * 
files = (x for x in Path(".") if x.is_file()) 
for file in files: 
    print(str(file), "is a file!") 

Questo è, a mio parere, più che usare Pythonic os.path.

Vedere anche: PEP 428.

+2

Un consiglio comune è evitare questo tipo di importazione. Cioè, piuttosto importa solo quello che usi, che nel tuo caso sarebbe semplicemente 'da pathlib import Path'. – Tshepang

+1

Mentre 'pathlib' è grande, direi che dipende dallo script in questione - se si tratta solo di file un paio di volte, a seconda di' pathlib' potrebbe essere eccessivo. –

2

Utilizzando pathlib in Windows come segue:

files = (x for x in Path("your_path") if x.is_file())

genera l'errore:

TypeError: 'WindowsPath' object is not iterable

Si dovrebbe invece usare Path.iterdir()

filePath = Path("your_path") 
if filePath.is_dir(): 
    files = list(x for x in filePath.iterdir() if x.is_file()) 
2
files = next(os.walk('..'))[2] 
0

Utilizzando pathlib, la via più breve t o elenca solo i file:

[x for x in Path("your_path").iterdir() if x.is_file()] 

con supporto di profondità se necessario.

Problemi correlati