2010-01-03 19 views
123

Quiero eliminar todos los archivos con la extensión .bak en un directorio. ¿Cómo puedo hacer eso en Python?Eliminar todos los archivos en un directorio con Python

+5

@ slh2080: Publicación de "Resuelto" no es lo que se hace en este sitio. Lo que debe hacer es elegir la respuesta que realmente utilizó y hacer clic en la marca de verificación para indicar que resolvió su problema. –

+0

Lo siento. Gracias por señalar mi error. No es tarea, solo estoy aprendiendo Python en mi tiempo libre. Hice clic en la respuesta que usé, pero eso fue antes de ver la respuesta de ghostdog74. – slh2080

+0

nota: para eliminar un árbol de directorios completo ['shutil.rmtree (ruta)' podría usarse] (https://docs.python.org/3/library/shutil.html#shutil.rmtree). – jfs

Respuesta

221

Via os.listdir y os.remove:

import os 

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ] 
for f in filelist: 
    os.remove(os.path.join(mydir, f)) 

O vía glob.glob:

import glob, os, os.path 

filelist = glob.glob(os.path.join(mydir, "*.bak")) 
for f in filelist: 
    os.remove(f) 

Asegúrese de estar en el directorio correcto, con el tiempo utilizando os.chdir.

+16

Su primer ejemplo es usar redundantes para bucles. Puede pasar con - [os.remove (f) para f en os.listdir (".") If f.endswith (". Bak")] - como listas de comprensión están destinados a ser utilizados. O puede mover el 'si' en la comprensión en el ciclo for - para f en os.listdir ("."): if f.endswith (". Bak"): os.remove (f) – dragonjujo

+0

@ slh2080 Como dice que el problema se ha resuelto, ¿por qué no marca la respuesta como la respuesta correcta? – blwy10

+4

@dragonjujo, sí lo sé, pero pensé que sería más claro de esta manera ... – miku

23

Utilice os.chdir para cambiar el directorio. Use glob.glob para generar una lista de nombres de archivos que terminen en '.bak'. Los elementos de la lista son solo cadenas.

Luego puede usar os.unlink para eliminar los archivos. (PS. os.unlink y os.remove son sinónimos para la misma función.)

#!/usr/bin/env python 
import glob 
import os 
directory='/path/to/dir' 
os.chdir(directory) 
files=glob.glob('*.bak') 
for filename in files: 
    os.unlink(filename) 
6

puede crear una función. Agregue maxdepth como desee para recorrer subdirectorios.

def findNremove(path,pattern,maxdepth=1): 
    cpath=path.count(os.sep) 
    for r,d,f in os.walk(path): 
     if r.count(os.sep) - cpath <maxdepth: 
      for files in f: 
       if files.endswith(pattern): 
        try: 
         print "Removing %s" % (os.path.join(r,files)) 
         #os.remove(os.path.join(r,files)) 
        except Exception,e: 
         print e 
        else: 
         print "%s removed" % (os.path.join(r,files)) 

path=os.path.join("/home","dir1","dir2") 
findNremove(path,".bak") 
7

En Python 3.5, os.scandir es mejor si usted necesita para comprobar si los atributos de archivo o tipo - ver os.DirEntry de propiedades del objeto que se devuelve por la función.

import os 

for file in os.scandir(path): 
    if file.name.endswith(".bak"): 
     os.unlink(file.path) 

Esto también No es necesario cambiar los directorios ya que cada DirEntry ya incluye la ruta completa al archivo.

+0

Te faltan dos puntos, la primera línea dentro del ciclo for debe ser 'if file.name.endswith (". Bak "):' – TSeymour

+0

¡Gracias!Eso me enseñará a escribir código sin ejecutarlo realmente –

0

En Linux y MacOS puede ejecutar comandos simples de la cáscara:

subprocess.run('rm /tmp/*.bak', shell=True) 
+0

No es una buena opción en mi opinión. No es portátil y probablemente sea más caro debido al subproceso adicional. Es mejor usar las API de Python. – Haakon

Cuestiones relacionadas