2011-10-20 21 views
5

Soy bastante nuevo en Python, pero he conseguido que este código funcione, y de hecho, hago lo que está destinado a hacer.Python Eliminando ciertas extensiones de archivos

Sin embargo, me pregunto si existe una forma más eficiente de codificar esto, tal vez para mejorar la velocidad de procesamiento.

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') 

En este momento, hay alrededor de 8.000 archivos, y se necesita bastante tiempo para procesar todos los archivos y comprobar si de hecho termina en png o jpg.

+1

Probablemente desee consultar ['os.path.walk'] (http://docs.python.org/library/os.path.html#os.path.walk). –

+0

¡Gracias! Voy a usar eso. – Two

Respuesta

15

Puesto que usted está de manera recursiva a través de subdirectorios, 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: ¡Gracias por la corrección! – unutbu

+0

Si cambia 'exts = ('. Png', '.jpg')' a 'exts = ['. Png', '.jpg']', el código también funcionará para solo 1 extensión. – AliBZ

+0

Pensé que realizar un tercer bucle for al final sería más lento que usar el método 'os.path.splitext()' y hacer una comparación, pero lo sincronicé y esta es la solución más rápida. – Blairg23

1

Si el programa funciona y la velocidad es aceptable, yo no lo cambiaría.

De lo contrario, podría intentar la respuesta de unutbu.

En general, me gustaría dejar las cosas de distancia

png = "png" 
jpg = "jpg" 

como yo no veo ningún propósito en no usar directamente las cuerdas.

Y mejor prueba para ".png" en lugar de "png".

Una mejor solución sería definir

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

algún lugar céntricamente y el uso que en

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

.

Cuestiones relacionadas