W3docs

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

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 send2trash
import 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étodoObjetivo¿Dir. no vacío?Notas
os.remove(path)Archivo individualClásico, ampliamente compatible
Path.unlink(missing_ok=True)Archivo individualModerno, seguro ante condiciones de carrera
os.rmdir(path)Directorio vacíoNoLanza OSError si no está vacío
Path.rmdir()Directorio vacíoNoEquivalente en pathlib
shutil.rmtree(path)Árbol de directoriosPermanente — usar con precaución
send2trash.send2trash(path)Archivo o carpetaRecuperable; requiere instalación

Puntos Clave

  • Usa Path.unlink(missing_ok=True) para eliminar archivos individuales en Python moderno (3.8+).
  • Usa os.rmdir() o Path.rmdir() solo para directorios vacíos.
  • Usa shutil.rmtree() para eliminar un directorio y todo su contenido — verifica primero la ruta.
  • Maneja siempre FileNotFoundError y PermissionError para hacer los scripts más robustos.
  • Prefiere send2trash cuando una eliminación reversible sea importante.

Capítulos Relacionados

Was this page helpful?