pathlib.Path.info en Python permite consultar de forma eficiente qué representa una ruta: un archivo, un directorio, un enlace simbólico u otro tipo de entrada del sistema de archivos. Es especialmente útil en inventarios, backups, indexadores, herramientas de compilación, procesadores por lotes y aplicaciones que deben clasificar miles de rutas sin repetir llamadas costosas al sistema operativo.
La idea central es reutilizar información. Cuando una iteración de directorio ya obtuvo metadatos básicos, Python puede conservarlos para responder consultas relacionadas. Así, el código mantiene la API orientada a objetos de pathlib y puede evitar operaciones redundantes.
Qué representa Path.info
Path.info agrupa consultas sobre existencia y tipo. Está asociado a un objeto Path y reduce la necesidad de mezclar os.path, llamadas manuales a stat y condiciones específicas de plataforma.
El beneficio aparece sobre todo después de recorrer un directorio. Muchos sistemas entregan información de tipo junto con cada entrada. Reutilizar esos datos puede ahorrar consultas en discos de red, volúmenes externos, contenedores y árboles grandes.
Ejemplo básico
from pathlib import Path
ruta = Path("datos/informe.csv")
if ruta.info.exists():
if ruta.info.is_file():
print("Es un archivo")
elif ruta.info.is_dir():
print("Es un directorio")
La inspección no abre el archivo ni garantiza que una lectura posterior tendrá éxito. Para leer, escribir, mover o eliminar, siguen siendo necesarios los métodos normales de Path y el tratamiento de excepciones.
Iteración de directorios
from pathlib import Path
raiz = Path("proyecto")
for entrada in raiz.iterdir():
if entrada.info.is_dir():
print("Directorio:", entrada.name)
elif entrada.info.is_file():
print("Archivo:", entrada.name)
elif entrada.info.is_symlink():
print("Enlace:", entrada.name)
Este es el caso más natural. En una carpeta con muchas entradas, evitar consultas repetidas puede marcar diferencia. El resultado depende del sistema operativo, el formato del disco, la latencia y el estado de las cachés, por lo que conviene medir.
Caché y datos desactualizados
La información puede quedar almacenada. Si otro proceso elimina o reemplaza un archivo, el objeto existente puede conservar una respuesta anterior. Debes tratar los datos como una fotografía del estado conocido y no como una garantía permanente.
from pathlib import Path
original = Path("entrada.txt")
print(original.info.exists())
# Después de posibles cambios externos
actual = Path(original)
print(actual.info.exists())
Esta diferencia es importante en watchers, colas, uploads y servicios concurrentes. El estado puede cambiar entre la comprobación y el uso, una condición conocida como TOCTOU.
Comprobar no significa tener permiso
Que una ruta sea un archivo no implica que el proceso pueda leerla. Los permisos pueden cambiar, el archivo puede desaparecer o el directorio padre puede volverse inaccesible.
from pathlib import Path
archivo = Path("config.toml")
if archivo.info.is_file():
try:
texto = archivo.read_text(encoding="utf-8")
except OSError as error:
print("No se pudo leer:", error)
La operación real debe considerarse la validación final. Las comprobaciones previas sirven para decidir flujo y mejorar mensajes, no para sustituir el manejo de errores.
Enlaces simbólicos
Con enlaces hay dos preguntas: si la propia ruta es un enlace y qué tipo tiene su destino. Algunas operaciones siguen el enlace y otras inspeccionan la entrada. Revisa la documentación de la versión exacta de Python.
En backups y sincronización define una política explícita: ignorar enlaces, conservarlos o seguir solo destinos dentro de una raíz aprobada. Seguir enlaces sin control puede sacar el proceso del árbol esperado.
Inventario de un directorio
from pathlib import Path
def inventario(raiz: Path) -> dict[str, int]:
totales = {
"archivos": 0,
"directorios": 0,
"enlaces": 0,
"otros": 0,
}
for entrada in raiz.iterdir():
if entrada.info.is_symlink():
totales["enlaces"] += 1
elif entrada.info.is_file():
totales["archivos"] += 1
elif entrada.info.is_dir():
totales["directorios"] += 1
else:
totales["otros"] += 1
return totales
La función clasifica un nivel. Para recorridos profundos utiliza una pila o cola y decide cómo manejar errores, enlaces y directorios enormes.
Recorrido recursivo iterativo
from pathlib import Path
def listar_archivos(raiz: Path):
pendientes = [raiz]
while pendientes:
actual = pendientes.pop()
try:
entradas = actual.iterdir()
except OSError:
continue
for entrada in entradas:
if entrada.info.is_symlink():
continue
if entrada.info.is_dir():
pendientes.append(entrada)
elif entrada.info.is_file():
yield entrada
Este diseño evita límites de recursión y no carga toda la lista en memoria. En producción registra errores, soporta cancelación y limita el trabajo cuando el árbol no es confiable.
Medir el rendimiento
No supongas que la caché mejora todo por igual. Las cachés del kernel, la red, el almacenamiento y la implementación influyen.
from pathlib import Path
from time import perf_counter
raiz = Path("dataset")
inicio = perf_counter()
cantidad = sum(1 for p in raiz.iterdir() if p.info.is_file())
tiempo = perf_counter() - inicio
print(cantidad, tiempo)
Ejecuta varias rondas, descarta calentamientos y compara implementaciones equivalentes. Una carpeta pequeña no representa un árbol de producción.
Compatibilidad de versiones
Path.info es reciente. Una biblioteca compatible con versiones anteriores necesita fallback.
from pathlib import Path
def es_archivo(ruta: Path) -> bool:
info = getattr(ruta, "info", None)
if info is not None:
return info.is_file()
return ruta.is_file()
Centraliza la compatibilidad y declara la versión mínima en pyproject.toml. La matriz de CI debe probar cada versión soportada.
Combinar con patrones
La clasificación funciona bien con glob, rglob, sufijos y filtros. Consulta las guías de Academify sobre pathlib en Python, glob en Python, el módulo os y manejo de excepciones.
from pathlib import Path
for entrada in Path("logs").glob("*.log"):
if entrada.info.is_file():
print(entrada)
Una extensión no garantiza un archivo normal. Un directorio, enlace, socket u otra entrada puede usar el mismo nombre.
Entradas especiales
Unix puede representar sockets, FIFO y dispositivos como rutas. Si la aplicación espera archivos normales, rechaza otros tipos. Leer un FIFO puede bloquear y acceder a dispositivos puede tener efectos graves.
En servicios que procesan archivos, una lista permitida es más segura: aceptar archivos regulares y directorios conocidos, y rechazar lo demás.
Rutas controladas por usuarios
Path.info no evita path traversal. Resuelve la ruta candidata contra una raíz aprobada y confirma que permanece dentro.
from pathlib import Path
RAIZ = Path("uploads").resolve()
def ruta_segura(nombre: str) -> Path:
destino = (RAIZ / nombre).resolve()
if destino != RAIZ and RAIZ not in destino.parents:
raise ValueError("Ruta fuera de la raíz permitida")
return destino
Después, trata igualmente los errores de la operación real. Consulta la documentación oficial de pathlib y os.
Pruebas
Crea directorios temporales con archivos, subdirectorios, enlaces rotos y casos de permisos. Verifica clasificación, fallback y eliminación entre comprobación y lectura. Las pruebas no deben depender de la máquina del desarrollador.
from pathlib import Path
def nombres_regulares(raiz: Path) -> list[str]:
return sorted(
entrada.name
for entrada in raiz.iterdir()
if entrada.info.is_file()
)
Cuándo usar Path.info
Úsalo al clasificar muchas entradas, especialmente las generadas por iteración. Es útil en inventarios, procesadores, builds, generadores de sitios, exploradores y backups.
Para una comprobación aislada, Path.is_file() o Path.is_dir() pueden ser más simples. Decide según claridad, compatibilidad y mediciones.
Errores frecuentes
Los errores habituales son confiar indefinidamente en datos almacenados, ignorar TOCTOU, seguir enlaces sin política, no capturar OSError, asumir compatibilidad con versiones antiguas y tratar metadatos como frontera de seguridad.
Separa responsabilidades: validar raíz, clasificar entrada, ejecutar operación y manejar fallos. Las funciones pequeñas facilitan pruebas.
Conclusión
pathlib.Path.info hace expresiva la clasificación y puede reutilizar metadatos obtenidos durante la iteración. Esto reduce llamadas redundantes en recorridos grandes. La caché exige cuidado: el sistema cambia, los permisos varían y los enlaces pueden conducir fuera del destino. Combina el recurso con excepciones, validación, reglas explícitas para enlaces, fallback de versiones y benchmarks realistas para obtener rendimiento sin perder corrección ni seguridad.







