2015-08-11 13 views
5

Sto provando a scorrere una cartella e tutte le sottocartelle per trovare tutti i file di determinati tipi di file, ad esempio solo .mp4, .avi, .wmv.Python - Loop dei file di determinate estensioni

Ecco quello che ho adesso, si scorre tutti i tipi di file:

import os 
rootdir = 'input' 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
      print (os.path.join(subdir, file)) 

Grazie!

risposta

6

È possibile utilizzare os.path.splitext che prende un percorso e suddivide l'estensione del file dalla fine di esso:

import os 
rootdir = 'input' 
extensions = ('.mp4', '.avi', '.wmv') 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     ext = os.path.splitext(file)[-1].lower() 
     if ext in extensions: 
      print (os.path.join(subdir, file)) 
+0

Grazie a ozgur, questo codice è il più vicino a quello che avevo originariamente - facile da capire. Le altre risposte potrebbero essere più efficienti se fatte su larga scala (non testate!), Ma per i miei compiti semplici questo sarà perfettamente sufficiente. – pufAmuf

13

Per più estensioni, il più semplice è solo per usare str.endswith passando una tupla di stringhe per controllare:

for file in files: 
     if file.endswith((".avi",".mp4","wmv")): 
     print (os.path.join(subdir, file)) 

Si potrebbe utilizzare iglob come qui di seguito e catena le ricerche restituiti o utilizzare re.search ma utilizzando endswith è probabilmente l'approccio migliore.

from itertools import chain 
from glob import iglob 

for subdir, dirs, files in os.walk(rootdir): 
    for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) for p in ("*.avi", "*.mp4", "*wmv")) : 
      print(os.path.join(subdir, file)) 

Utilizzando python3.5glob ora supporta ricerche ricorsive con il ** sintassi:

from itertools import chain 
from glob import iglob 

from glob import iglob 
for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) 
     for p in (rootdir+"**/*.avi", "**/*.mp4", "**/*wmv")): 
      print(file) 
+0

Grazie per la spiegazione dettagliata Padraic, molto interessante come si può fare una cosa in tanti modi diversi Pitone. – pufAmuf

+0

No prob, prego. –

+1

passare la tupla +1 –

3

realtà ho fatto qualcosa di simile a questo un paio di giorni fa e qui è come ho fatto:

EXTENSIONS = ('.cpp','.hpp') 

for root, dirs, files in os.walk(top): 
    for file in files: 
     if file.endswith(EXTENSIONS): 
      #file which ends with extension type so do your thing! 

Spero che questo sia quello che cerchi. Puoi vedere l'intero script qui sul mio github.

+0

Grazie Sam, il tuo aiuto è molto apprezzato! – pufAmuf

Problemi correlati