Pathlib en Python
🗺️ Mapa de la Lección
⏱ 45 minutos🟡 Intermedio🎯 Qué aprenderás
- Usar Pathlib en lugar de strings para rutas
- Combinar rutas de forma segura entre sistemas
- Extraer partes de rutas (nombre, extensión, directorio)
- Verificar existencia de archivos y directorios
- Crear y eliminar archivos y directorios
🌍 Para qué te sirve
- Trabajar con archivos y directorios de forma segura
- Código multiplataforma (Windows, Linux, Mac)
- Procesar archivos en directorios
- Organizar proyectos con rutas relativas
- Scripts que manipulan archivos del sistema
- APIs que manejan uploads y downloads
🎯 ¿Por qué aprender Pathlib?
Tradicionalmente en Python trabajabas con rutas como strings: ruta = "/home/usuario/documentos/archivo.txt". Esto funciona, pero tiene problemas: difícil de combinar rutas, difícil de extraer partes, y no es seguro entre Windows, Linux y Mac.
Pathlib es esencial porque:
- Código multiplataforma: funciona igual en Windows, Linux y Mac
- Más legible: sintaxis clara y expresiva
- Menos errores: maneja automáticamente diferencias entre sistemas
- Estándar moderno: es la forma recomendada en Python 3.6+
🌍 Casos reales donde se usa
Pathlib está en todos los proyectos que trabajan con archivos:
- Trabajar con archivos: Leer, escribir, verificar existencia
- Código multiplataforma: Scripts que funcionan en cualquier sistema
- Procesar archivos: Iterar sobre directorios y archivos
- Organizar proyectos: Manejar rutas relativas y absolutas
- APIs: Manejar uploads y downloads de archivos
- Scripts del sistema: Manipular archivos y directorios
Ejemplo real: Un script que procesa imágenes en una carpeta usa Pathlib para encontrar todos los archivos .jpg, sin importar si se ejecuta en Windows o Linux.
💡 Concepto base
Pathlib te da un objeto Path que maneja rutas de forma elegante y funciona en cualquier sistema operativo. Es la forma moderna y recomendada de trabajar con archivos.
Lo genial de Python: Puedes combinar rutas con / (como en matemáticas) y usar métodos claros como .name, .suffix, .parent.
from pathlib import Path
# Crear un Path
ruta = Path("documentos") / "recetas" / "chilaquiles.txt"
print(f"Nombre: {ruta.name}")
print(f"Extensión: {ruta.suffix}")
print(f"Directorio padre: {ruta.parent}")
Nombre: chilaquiles.txt
Extensión: .txt
Directorio padre: documentos/recetas
Pathlib es como tener un sistema de organización de ingredientes que funciona igual en cualquier cocina (Windows, Linux, Mac). En lugar de recordar dónde guardas cada cosa en cada tipo de cocina, Pathlib te da una forma universal de encontrar y organizar tus archivos. Es como tener etiquetas estandarizadas que funcionan igual si estás en una cocina mexicana, italiana o francesa. No importa dónde estés, siempre sabes cómo encontrar lo que necesitas.
Antes de continuar: Asegúrate de entender Funciones y Manejo de Errores. Pathlib es la forma moderna de trabajar con archivos. Si aprendiste os.path, Pathlib es mejor y más fácil de usar.
Conceptos Básicos
Crear y Manipular Paths
Primero importas Path y creas objetos de ruta:
from pathlib import Path
# Crear un Path (relativo al directorio actual)
ruta = Path('directorio/archivo.txt')
# Path absoluto (desde la raíz del sistema)
ruta_absoluta = Path('/home/usuario/directorio/archivo.txt')
# Path relativo explícito (el ./ es opcional)
ruta_relativa = Path('./directorio/archivo.txt')
¿Cuál usar?
- Relativo: Cuando trabajas dentro de tu proyecto
- Absoluto: Cuando necesitas una ruta específica del sistema
Operaciones Básicas: Extraer Información
Pathlib te da métodos claros para obtener partes de la ruta:
# Obtener partes del path
ruta = Path('/home/usuario/directorio/archivo.txt')
print(ruta.name) # 'archivo.txt' - nombre completo del archivo
print(ruta.suffix) # '.txt' - extensión del archivo
print(ruta.stem) # 'archivo' - nombre sin extensión
print(ruta.parent) # Path('/home/usuario/directorio') - directorio padre
print(ruta.parts) # ('/', 'home', 'usuario', 'directorio', 'archivo.txt') - tupla con todas las partes
¿Por qué es útil?
ruta.name→ Para mostrar el nombre del archivo al usuarioruta.suffix→ Para verificar el tipo de archivo (.txt,.json, etc.)ruta.parent→ Para crear archivos en el mismo directorioruta.stem→ Para cambiar la extensión manteniendo el nombre
Combinar Paths (Lo Mejor de Pathlib)
En lugar de concatenar strings, usas el operador /:
# Unir paths - funciona en Windows, Linux y Mac
ruta_base = Path('/home/usuario')
ruta_completa = ruta_base / 'directorio' / 'archivo.txt'
# Resultado: Path('/home/usuario/directorio/archivo.txt')
Comparación con el método viejo:
# ❌ Viejo método (os.path) - verboso y propenso a errores
import os
ruta_vieja = os.path.join(os.path.join('/home/usuario', 'directorio'), 'archivo.txt')
# ✅ Pathlib - claro y legible
ruta_nueva = Path('/home/usuario') / 'directorio' / 'archivo.txt'
Ventaja: El / funciona en todos los sistemas operativos. Pathlib se encarga de usar / o \ según corresponda.
Operaciones con Archivos
Verificar Existencia
ruta = Path('archivo.txt')
# Verificar si existe
if ruta.exists():
print("El archivo existe")
# Verificar si es archivo o directorio
if ruta.is_file():
print("Es un archivo")
if ruta.is_dir():
print("Es un directorio")
Crear y Eliminar
# Crear directorio
ruta = Path('nuevo_directorio')
ruta.mkdir(exist_ok=True)
# Crear archivo
archivo = Path('nuevo_archivo.txt')
archivo.touch()
# Eliminar
archivo.unlink() # Eliminar archivo
ruta.rmdir() # Eliminar directorio vacío
Leer y Escribir
# Escribir archivo
ruta = Path('archivo.txt')
ruta.write_text('Contenido del archivo')
# Leer archivo
contenido = ruta.read_text()
# Leer bytes
bytes_contenido = ruta.read_bytes()
Operaciones con Directorios
Listar Contenido
# Listar archivos en directorio
directorio = Path('.')
# Listar todos los archivos
for archivo in directorio.iterdir():
print(archivo)
# Listar archivos con patrón
for archivo in directorio.glob('*.txt'):
print(archivo)
# Búsqueda recursiva
for archivo in directorio.rglob('*.txt'):
print(archivo)
Crear Estructura de Directorios
# Crear directorios anidados
ruta = Path('dir1/dir2/dir3')
ruta.mkdir(parents=True, exist_ok=True)
Ejemplos Prácticos
Copiar Archivos
from pathlib import Path
import shutil
def copiar_archivo(origen: Path, destino: Path):
if not origen.exists():
raise FileNotFoundError(f"Archivo no encontrado: {origen}")
# Crear directorio de destino si no existe
destino.parent.mkdir(parents=True, exist_ok=True)
# Copiar archivo
shutil.copy2(origen, destino)
Buscar Archivos
def buscar_archivos(directorio: Path, patron: str) -> list[Path]:
return list(directorio.rglob(patron))
# Uso
archivos = buscar_archivos(Path('.'), '*.py')
for archivo in archivos:
print(f"Encontrado: {archivo}")
Gestionar Backups
from datetime import datetime
def crear_backup(archivo: Path):
if not archivo.exists():
raise FileNotFoundError(f"Archivo no encontrado: {archivo}")
# Crear nombre de backup con timestamp
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup = archivo.parent / f"{archivo.stem}_{timestamp}{archivo.suffix}"
# Copiar archivo
shutil.copy2(archivo, backup)
return backup
Buenas Prácticas
- Usar Path en lugar de strings
# ❌ Mal
ruta = '/home/usuario/archivo.txt'
# ✅ Bien
ruta = Path('/home/usuario/archivo.txt')
- Manejar Errores
def procesar_archivo(ruta: Path):
try:
if not ruta.exists():
raise FileNotFoundError(f"Archivo no encontrado: {ruta}")
# Procesar archivo
contenido = ruta.read_text()
# ...
except PermissionError:
print(f"Sin permisos para acceder a: {ruta}")
except Exception as e:
print(f"Error al procesar archivo: {e}")
- Validar Paths
def validar_path(ruta: Path) -> bool:
return (
ruta.exists() and
ruta.is_file() and
ruta.suffix == '.txt'
)
Consejos
- Usa
Pathen lugar deos.path - Prefiere métodos de
Pathsobre operaciones de string - Maneja los errores apropiadamente
- Usa
parents=Trueal crear directorios - Considera la portabilidad entre sistemas operativos
Recursos Adicionales
Documentación Oficial
Bibliografía Recomendada
- Python Tricks (Dan Bader) - Capítulo sobre pathlib
- Effective Python (Brett Slatkin) - Item 37: Use Comprehensions Instead of map and filter
- Python Cookbook, 3rd Ed (Beazley & Jones) - Recetas sobre manejo de archivos
- Automate the Boring Stuff (Al Sweigart) - Capítulo 8: Reading and Writing Files
Conceptos Relacionados
- XML - Trabaja con archivos XML
- Context Managers - Maneja archivos de forma segura
- JSON - Trabaja con archivos JSON
Siguiente paso
Ahora que sabes trabajar con rutas, aprende a procesar formatos de datos comunes. Continúa con: JSON o XML