Adloun

Un tableur français a exporté la colonne moyenne avec des virgules…

Exercice de TD · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Doublons, cohérence, domaines

Énoncé

Un tableur français a exporté la colonne moyenne avec des virgules décimales, et une valeur y est écrite "inconnue". Que fait float ? Écrire une conversion qui accepte la virgule et met de côté les lignes irrécupérables plutôt que de tout interrompre.

Corrigé

Ce que fait float. Il refuse la virgule :


ValueError: could not convert string to float: '15,5'

Et le convertir du cours propage l'erreur : la conversion s'arrête en cours de route, laissant la table à moitié convertie. C'est le pire état possible.


def vers_float(s):
    """Flottant lu depuis une écriture française : virgule décimale,
    espaces éventuels autour."""
    return float(s.replace(",", ".").strip())

def convertir_tolerant(table, colonne, fonction):
    """Sépare les lignes converties des lignes irrécupérables.

    Postcondition : len(bonnes) + len(rejetees) == len(table), et la
                    table d'origine n'est pas modifiée.
    """
    bonnes, rejetees = [], []
    for ligne in table:
        try:
            neuve = dict(ligne)
            neuve[colonne] = fonction(ligne[colonne])
            bonnes.append(neuve)
        except (ValueError, TypeError):
            rejetees.append(ligne)
    return bonnes, rejetees

Contrôle. Sur la colonne ['15,5', '12,0', 'inconnue', '17,25'], on obtient [15.5, 12.0, 17.25] de converties et une seule rejetée, celle de Yanis.

La règle. Rejeter n'est acceptable que si on le dit. Un import qui écarte silencieusement des lignes est un mensonge par omission : le décompte des lignes rejetées fait partie du résultat, comme le demande la piste de projet du chapitre.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.