Eliminar Archivos y Directorios en Python
Aprende a eliminar archivos y directorios en Python con os.remove, pathlib.Path.unlink, os.rmdir y shutil.rmtree con manejo seguro de errores.
Este capítulo cubre todas las formas estándar de eliminar archivos y directorios en Python — desde el clásico módulo os hasta la moderna API pathlib y el módulo shutil para directorios no vacíos. También aprenderás patrones seguros para el manejo de errores, de modo que tu código falle de forma controlada cuando un archivo ya no existe o se deniega un permiso.
Eliminar un Archivo Individual
Usando os.remove()
El módulo os forma parte de la biblioteca estándar de Python y proporciona una interfaz portable para las funciones del sistema operativo. os.remove() elimina un único archivo. Lanza FileNotFoundError si la ruta no existe y PermissionError si el proceso carece de los permisos necesarios.
Eliminar un archivo con os.remove()
import os
os.remove("report.txt")Envuelve la llamada en un bloque try/except para que tu programa gestione de forma controlada los archivos inexistentes:
Eliminar un archivo con manejo de errores
import os
try:
os.remove("report.txt")
print("File deleted.")
except FileNotFoundError:
print("File not found — nothing to delete.")
except PermissionError:
print("Permission denied.")Usando pathlib.Path.unlink() (Python 3.4+)
pathlib proporciona una interfaz orientada a objetos para las rutas del sistema de archivos. Path.unlink() elimina el archivo al que apunta la ruta. Desde Python 3.8 puedes pasar missing_ok=True para suprimir FileNotFoundError automáticamente.
Eliminar un archivo con pathlib
from pathlib import Path
# Raises FileNotFoundError if the file does not exist
Path("report.txt").unlink()Eliminar un archivo de forma silenciosa si no existe (Python 3.8+)
from pathlib import Path
Path("report.txt").unlink(missing_ok=True)
print("Done — file deleted or was already absent.")missing_ok=True es la alternativa idiomática de Python 3.8+ al patrón comprobar-y-eliminar. Prefiere esta opción frente a las comprobaciones con os.path.exists() porque evita una condición de carrera: otro proceso podría eliminar el archivo entre tu comprobación y tu llamada de eliminación.
Comprobar la existencia antes de eliminar (patrón clásico)
Antes de que se añadiera missing_ok, el enfoque estándar era usar una guarda con os.path.exists():
Comprobar la existencia antes de eliminar
import os
if os.path.exists("report.txt"):
os.remove("report.txt")
else:
print("File not found.")Esto funciona bien para scripts donde las condiciones de carrera no son una preocupación, pero missing_ok=True es más limpio en código nuevo.
Eliminar un Directorio Vacío
os.rmdir() elimina un directorio, pero solo si está vacío. Lanza OSError si el directorio contiene archivos o subdirectorios.
Eliminar un directorio vacío
import os
try:
os.rmdir("empty_folder")
print("Directory removed.")
except FileNotFoundError:
print("Directory not found.")
except OSError:
print("Directory is not empty or cannot be removed.")Con pathlib, usa Path.rmdir():
from pathlib import Path
Path("empty_folder").rmdir()Eliminar un Directorio No Vacío
Para eliminar un directorio y todo su contenido (archivos, subdirectorios y su contenido), usa shutil.rmtree(). Esto equivale a rm -rf en Unix — es permanente e irreversible.
Eliminar un árbol de directorios
import shutil
shutil.rmtree("old_project")
print("Directory and all its contents deleted.")Añade manejo de errores para los modos de fallo más comunes:
Eliminar un árbol de directorios de forma segura
import shutil
try:
shutil.rmtree("old_project")
print("Deleted successfully.")
except FileNotFoundError:
print("Directory not found.")
except PermissionError:
print("Permission denied.")El parámetro ignore_errors
Pasa ignore_errors=True para suprimir todos los errores de forma silenciosa. Úsalo solo cuando realmente no te importe si la eliminación tuvo éxito:
import shutil
shutil.rmtree("old_project", ignore_errors=True)Eliminar Múltiples Archivos que Coincidan con un Patrón
Para eliminar todos los archivos que coincidan con un patrón glob, combina pathlib.Path.glob() con unlink():
Eliminar todos los archivos .log de un directorio
from pathlib import Path
deleted = 0
for log_file in Path(".").glob("*.log"):
log_file.unlink()
deleted += 1
print(f"{deleted} log file(s) deleted.")Para buscar en subdirectorios de forma recursiva, usa rglob():
Eliminar todos los archivos .tmp en un árbol de directorios
from pathlib import Path
for tmp_file in Path(".").rglob("*.tmp"):
tmp_file.unlink(missing_ok=True)El equivalente con el módulo os usa os.listdir() y os.remove():
Eliminar todos los archivos .txt usando os
import os
directory = "."
for filename in os.listdir(directory):
if filename.endswith(".txt"):
os.remove(os.path.join(directory, filename))Revisa siempre qué archivos coinciden antes de ejecutar una eliminación masiva. Un pase rápido con print() antes del bucle de eliminación es un buen hábito.
Enviar Archivos a la Papelera de Reciclaje (Eliminación Reversible)
os.remove() y Path.unlink() eliminan archivos de forma permanente — no hay posibilidad de deshacer. Si necesitas una eliminación recuperable (enviar un archivo a la Papelera del sistema), instala el paquete de terceros send2trash:
pip install send2trashimport send2trash
send2trash.send2trash("report.txt")
print("File moved to Trash.")Esto es útil en herramientas de escritorio o scripts donde una eliminación accidental sería catastrófica.
Comparación de Métodos de Eliminación
| Método | Objetivo | ¿Dir. no vacío? | Notas |
|---|---|---|---|
os.remove(path) | Archivo individual | — | Clásico, ampliamente compatible |
Path.unlink(missing_ok=True) | Archivo individual | — | Moderno, seguro ante condiciones de carrera |
os.rmdir(path) | Directorio vacío | No | Lanza OSError si no está vacío |
Path.rmdir() | Directorio vacío | No | Equivalente en pathlib |
shutil.rmtree(path) | Árbol de directorios | Sí | Permanente — usar con precaución |
send2trash.send2trash(path) | Archivo o carpeta | Sí | Recuperable; requiere instalación |
Puntos Clave
- Usa
Path.unlink(missing_ok=True)para eliminar archivos individuales en Python moderno (3.8+). - Usa
os.rmdir()oPath.rmdir()solo para directorios vacíos. - Usa
shutil.rmtree()para eliminar un directorio y todo su contenido — verifica primero la ruta. - Maneja siempre
FileNotFoundErroryPermissionErrorpara hacer los scripts más robustos. - Prefiere
send2trashcuando una eliminación reversible sea importante.
Capítulos Relacionados
- Manejo de Archivos en Python — apertura, modos y la declaración
with - Leer Archivos en Python — leer datos de archivos
- Escribir/Crear Archivos en Python — escribir y crear archivos
- Try Except en Python — manejo robusto de excepciones