← Todos los trabajos

Escribe un script cuenta_lineas.py que reciba una carpeta y muestre cuantas…

Cuenta_lineas.py Usa `argparse` y `pathlib`; consulté la documentación oficial de Python para `argparse` y `pathlib`.

cuenta_lineas.py

#!/usr/bin/env python3
"""Cuenta lineas de ficheros Python dentro de una carpeta."""

from __future__ import annotations

import argparse
import sys
from pathlib import Path


def parse_args(argv: list[str]) -> argparse.Namespace:
    """Construye y procesa los argumentos de linea de comandos."""
    parser = argparse.ArgumentParser(
        description="Muestra las lineas de cada fichero .py, de mas a menos."
    )
    parser.add_argument("carpeta", type=Path, help="Carpeta que se quiere analizar")
    return parser.parse_args(argv)


def python_files(folder: Path) -> list[Path]:
    if not folder.exists():
        raise FileNotFoundError(f"No existe la carpeta: {folder}")
    if not folder.is_dir():
        raise NotADirectoryError(f"No es una carpeta: {folder}")

    return sorted(path for path in folder.rglob("*.py") if path.is_file())


def count_lines(path: Path) -> int:
    with path.open("r", encoding="utf-8") as file:
        return sum(1 for _ in file)


def line_counts(folder: Path) -> list[tuple[Path, int]]:
    counts = [(path, count_lines(path)) for path in python_files(folder)]
    return sorted(counts, key=lambda item: (-item[1], str(item[0])))


def main(argv: list[str] | None = None) -> int:
    args = parse_args(sys.argv[1:] if argv is None else argv)
    folder = args.carpeta.resolve()

    try:
        counts = line_counts(folder)
    except (FileNotFoundError, NotADirectoryError, PermissionError, UnicodeDecodeError) as error:
        print(f"Error: {error}", file=sys.stderr)
        return 1

    for path, lines in counts:
        print(f"{lines:6d} {path.relative_to(folder)}")

    return 0


if __name__ == "__main__":
    raise SystemExit(main())

Funcionando

Verificación:
```bash
python3 -m py_compile cuenta_lineas.py
```
Salida: sin salida, terminó correctamente.

Comando pedido:
```bash
python3 cuenta_lineas.py .
```

Salida:
```text
    56 cuenta_lineas.py
```