2011-10-20 5 views
5

Sono abbastanza nuovo per Python, ma ho ottenuto questo codice per funzionare e, in effetti, faccio ciò che è destinato a fare.Python eliminazione di alcune estensioni di file

Tuttavia, mi chiedo se esiste un modo più efficiente per codificarlo, forse per migliorare la velocità di elaborazione.

import os, glob 


def scandirs(path): 
    for currentFile in glob.glob(os.path.join(path, '*')): 
     if os.path.isdir(currentFile): 
      print 'got a directory: ' + currentFile 
      scandirs(currentFile) 
     print "processing file: " + currentFile 
     png = "png"; 
     jpg = "jpg"; 
     if currentFile.endswith(png) or currentFile.endswith(jpg): 
      os.remove(currentFile) 

scandirs('C:\Program Files (x86)\music\Songs') 

In questo momento, ci sono circa 8000 file, e ci vuole un po 'di tempo per elaborare ogni file e verificare se finisce davvero in png o jpg.

+1

Probabilmente si desidera controllare ['os.path.walk'] (http://docs.python.org/library/os.path.html#os.path.walk). –

+0

Grazie! Lo userò. – Two

risposta

15

Dal momento che si sta recursing attraverso le sottodirectory, utilizzare os.walk:

import os 

def scandirs(path): 
    for root, dirs, files in os.walk(path): 
     for currentFile in files: 
      print "processing file: " + currentFile 
      exts = ('.png', '.jpg') 
      if any(currentFile.lower().endswith(ext) for ext in exts): 
       os.remove(os.path.join(root, currentFile)) 
+0

@ Sam: Grazie per la correzione! – unutbu

+0

Se si cambia 'exts = ('. Png', '.jpg')' a 'exts = ['. Png', '.jpg']', il codice funzionerà anche per solo 1 estensione. – AliBZ

+0

Ho pensato che eseguire un 3 ° ciclo alla fine sarebbe più lento che usare il metodo 'os.path.splitext()' e fare un confronto, ma l'ho cronometrato e questa è la soluzione più veloce. – Blairg23

1

Se il programma funziona e la velocità è accettabile, non vorrei cambiarlo.

Altrimenti, si potrebbe provare la risposta di unutbu.

In generale, vorrei lasciare via la roba

png = "png" 
jpg = "jpg" 

come io non vedo alcun scopo non utilizzare direttamente le corde.

E un test migliore per ".png" anziché "png".

Una soluzione ancora migliore sarebbe quella di definire

extensions = ('.png', '.jpg') 

qualche parte centally e l'uso che in

if any(currentFile.endswith(ext) for ext in extensions): 
    os.remove(currentFile) 

.