TP Python – Analyser un journal de connexions
BTS SIO SISR 2e année – Pour aller plus loin – S18
Note
Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.
Exercice A – Lire une ligne
Écris parse_ligne(ligne) qui renvoie le couple (adresse, statut) d'une ligne "adresse;statut", en retirant les espaces autour des deux champs.
J'anticipe. Que renvoie " a ; OK ".split(";") ? Que faut-il en plus ?
def parsepy-undligne(ligne):bksl-nl """(adresse, statut) d'une ligne 'adresse;statut'."""bksl-nl ...bksl-nlbksl-nl
Exercice B – Compter les échecs
Écris echecs_par_ip(lignes) qui renvoie un dictionnaire adresse → nombre d'échecs, uniquement pour les adresses ayant au moins un échec. Réutilise parse_ligne (recopie-la au début du fichier).
def parsepy-undligne(ligne):bksl-nl ip, statut = ligne.split(";")bksl-nl return (ip.strip(), statut.strip())bksl-nlbksl-nlbksl-nldef echecspy-undparpy-undip(lignes):bksl-nl """Dictionnaire adresse -> nombre d'echecs (>= 1)."""bksl-nl ...bksl-nlbksl-nl
Je comprends. Énonce l'invariant de ta boucle.
Exercice C – Adresses suspectes
Écris suspectes(lignes, seuil) qui renvoie la liste triée des adresses ayant au moins seuil échecs.
def parsepy-undligne(ligne):bksl-nl ip, statut = ligne.split(";")bksl-nl return (ip.strip(), statut.strip())bksl-nlbksl-nlbksl-nldef echecspy-undparpy-undip(lignes):bksl-nl d = {}bksl-nl for l in lignes:bksl-nl ip, statut = parsepy-undligne(l)bksl-nl if statut == "ECHEC":bksl-nl d[ip] = d.get(ip, 0) + 1bksl-nl return dbksl-nlbksl-nlbksl-nldef suspectes(lignes, seuil):bksl-nl """Adresses (triees) avec au moins seuil echecs."""bksl-nl ...bksl-nlbksl-nl
Exercice D – Rafale d'échecs
Écris rafale(lignes, ip, k) qui renvoie True si l'adresse ip a au moins k échecs consécutifs parmi ses lignes (un OK interrompt la série). On considère k >= 1.
J'anticipe. Pour ["a;ECHEC", "a;OK", "a;ECHEC", "a;ECHEC"], quelle est la plus longue série d'échecs de a ?
def rafale(lignes, ip, k):bksl-nl """True si ip a au moins k echecs consecutifs."""bksl-nl ...bksl-nlbksl-nl
Exercice E – Rapport
Écris rapport(lignes, seuil) qui renvoie la liste de chaînes "adresse : n" pour les adresses suspectes, triée par nombre d'échecs décroissant, puis par adresse croissante.
def rapport(lignes, seuil):bksl-nl """Lignes 'adresse : n' triees par n decroissant puis adresse."""bksl-nl ...bksl-nlbksl-nl