Cuenta_lineas.py Usa `argparse` y `pathlib`; consulté la documentación oficial de Python para `argparse` y `pathlib`.
#!/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())
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
```