Recuento de directorios y archivos
Para completar el tratamiento de los directorios y de los archivos como datos, en esta entrada retomaremos su recuento pero esta vez haciendo uso de la biblioteca pathlib. De este modo dispondremos de un recurso con funcionalidad similar a la que ofrece os, pero más actualizado. Sólo nos interesa aquí como alternativa, por lo que me limitaré a unos mínimos en el tratamiento de esta cuestión.
Empezaré por presentar un script que resume los procedimientos vistos en las dos entradas anteriores de esta misma subsección: el recuento en profundidad de directorios y archivos de forma diferenciada y la cuantificación de los archivos en función de su extensión.
from pathlib import Path
from collections import Counter
#---- FUNCIÓN-------------------------------------------------------------
def analizar_directorio(ruta_entrada, archivo_salida):
# Convertimos la cadena de texto en un objeto Path
path_raiz = Path(ruta_entrada)
if not path_raiz.exists() or not path_raiz.is_dir():
print(f"Error: La ruta '{ruta_entrada}' no es un directorio válido.")
return
# Inicializamos contadores
total_directorios = 0
total_archivos = 0
extensiones = Counter()
# rglob('*') busca de forma recursiva en todos los niveles
for elemento in path_raiz.rglob('*'):
if elemento.is_dir():
total_directorios += 1
elif elemento.is_file():
total_archivos += 1
# .suffix devuelve la extensión con el punto (ej: .txt)
ext = elemento.suffix.lower() if elemento.suffix else "Sin extensión"
extensiones[ext] += 1
# Construcción del informe de resultados
informe = []
informe.append("=" * 50)
informe.append(f"INFORME DE ANÁLISIS RECURSIVO")
informe.append(f"Directorio origen: {path_raiz.absolute()}")
informe.append("=" * 50)
informe.append(f"Total de directorios encontrados: {total_directorios}")
informe.append(f"Total de archivos encontrados: {total_archivos}")
informe.append("-" * 50)
informe.append(f"{'EXTENSIÓN':<20} | {'CANTIDAD':<10}")
informe.append("-" * 50)
# Ordenar extensiones por frecuencia (de mayor a menor)
for ext, cuenta in extensiones.most_common():
informe.append(f"{ext:<20} | {cuenta:<10}")
informe.append("=" * 50)
# Convertir la lista del informe en un solo string
texto_final = "\n".join(informe)
# Mostrar por pantalla
print(texto_final)
# Guardar en archivo TXT
try:
# Pathlib también permite escribir archivos directamente
Path(archivo_salida).write_text(texto_final, encoding='utf-8')
print(f"\n[ÉXITO] El informe se ha guardado en: {archivo_salida}")
except Exception as e:
print(f"\n[ERROR] No se pudo escribir el archivo: {e}")
# --- USO DE LA FUNCIÓN -------------------------------------------------------
mi_directorio = "D:/BasesDatosTest"
nombre_txt = "analisis_pathlib.txt"
analizar_directorio(mi_directorio, nombre_txt)
Además de la diferencia esperada en cuanto importación de librerías (pathlib frente a os, y Counter de la biblioteca collections), las diferencias claves respecto a los script basados en os radica en el uso de determindas funciones específicas de pathlib:
- la función
Path.rglob('*')simplifica la búsqueda recursiva ("r" viene de "recursive"). Al usar el comodín *, pedimos que busque todo lo que hay dentro del directorio, con independencia de los niveles de anidamiento que pueda presentar su estructura. Counteres un diccionario especializado que automatiza el conteo de las exteniones de los archivos (extensiones = Counter()).- El atributo
.suffixdevuelve directamente la extensión del archivo (elemento.suffix.lower()). Mediante.lowerunificamos el formato de la extensión a minúsculas evitando así posibles duplicidades.
Aunque es una cuestión secundaria en este script, interesa destacar también la forma en que se genera aquí el archivo .txt, ya que supone una mejora respecto al modo básico de proceder: Path.write_text() es una forma abreviada de escribir archivos de texto sin necesidad de abrir y cerrar flujos manualmente.
Nota
El código mostrado en esta entrada ha sido desarrollado usando IA Gemini 3 y posteriormente adaptado por el autor.
No hay comentarios:
Publicar un comentario
Comenta esta entrada