Adloun

Un CSV contient l'adresse "12, rue des Lilas" , avec une virgule dans…

Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Importer, convertir, contrôler

Énoncé

Un CSV contient l'adresse "12, rue des Lilas", avec une virgule dans le champ. Comparer le découpage par split(",") et la lecture par le module csv. Quel contrôle simple aurait signalé le défaut ?

Corrigé


nom,adresse,ville
Nour,"12, rue des Lilas",Lyon
Camille,"3 place du Marche",Nantes

Le découpage naïf.


[l.rstrip("\n").split(",") for l in open("guil.csv", encoding="utf-8")]
# longueurs : [3, 4, 3]
# ligne 1 : ['Nour', '"12', ' rue des Lilas"', 'Lyon']

La ligne de Nour se coupe en quatre champs au lieu de trois ; l'adresse est éclatée en deux morceaux qui portent chacun un guillemet orphelin, et la ville se retrouve décalée d'une position. Toutes les lignes suivantes sont justes — le défaut ne touche qu'une ligne sur trois, ce qui le rend d'autant plus difficile à voir.

La lecture par le module. importer rend trois champs sur chaque ligne, et propre[0]["adresse"] vaut bien '12, rue des Lilas', virgule comprise. Le module connaît la règle du format : un champ entouré de guillemets peut contenir le séparateur.

Le contrôle. Toutes les lignes doivent avoir le même nombre de champs que l'en-tête :


lignes = [l.rstrip("\n").split(",") for l in open(chemin, encoding="utf-8")]
attendu = len(lignes[0])
assert all(len(l) == attendu for l in lignes), "champs de longueur variable"

Il se déclenche ici, sur la ligne à quatre champs. C'est un contrôle à une ligne, et il rattrape la seule catégorie d'erreur que le découpage naïf produit.

La conclusion du cours, vérifiée : le module csv sait ce que split ignore, et il ne faut pas le réécrire.

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.