Eliminar todos los archivos en un directorio con Python


147

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


55
@ slh2080: Publicar "Resuelto" no es lo que haces 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.
S.Lott

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

nota: para eliminar un árbol de directorios completo shutil.rmtree(path)podría usarse .
jfs

Respuestas:


270

Vía os.listdiry 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 a través de 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, eventualmente utilizando os.chdir.


21
Su primer ejemplo es usar redundantes para bucles. Puede pasar con - [os.remove (f) for f en os.listdir (".") Si f.endswith (". Bak")] - ya que las comprensiones de listas están destinadas a ser utilizadas. O puede mover el 'if' en la comprensión al bucle for - for f en os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo

@ slh2080 Dado que usted dice que el problema se ha resuelto, ¿por qué no marcar la respuesta como la respuesta correcta?
blwy10

55
Cuidado con el os.listdir (".") !!! Usé este código y olvidé cambiar la ruta, ¡todo mi código había desaparecido! ¡Intenté dos utilidades diferentes para recuperarse pero sin suerte!
Lei Guo

@LeiGuo Solucionó eso.
yugr

26

Use os.chdirpara cambiar el directorio. Se usa glob.globpara generar una lista de nombres de archivo que terminan en '.bak'. Los elementos de la lista son solo cadenas.

Entonces podría usar os.unlinkpara eliminar los archivos. (PS. os.unlinkY os.removeson sinónimos de 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)

18

En Python 3.5, os.scandires mejor si necesita verificar los atributos o el tipo de archivo; consulte las os.DirEntrypropiedades del objeto que devuelve la función.

import os 

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

Esto tampoco requiere el cambio de directorios ya que cada uno DirEntryya incluye la ruta completa al archivo.


Te falta un colon, la primera línea dentro del bucle for debería serif file.name.endswith(".bak"):
TSeymour el

¡Gracias! Eso me enseñará a escribir código sin ejecutarlos realmente
Yi Jiang

8

Puedes 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")


1

En Linux y macOS, puede ejecutar un comando simple en el shell:

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

3
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

0

Me doy cuenta de que esto es viejo; sin embargo, aquí sería cómo hacerlo usando solo el módulo os ...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.