Table des matières
Consolider un fichier de données
À télécharger : distance.py – personnes.csv
Dans ce sujet, nous devons assainir un fichier de données qui contient de nombreuses irrégularités. Comme le fichier est assez gros, on veut le faire automatiquement, pas à la main.
Fichier personnes.csv
Vous disposez du fichier personnes.csv codé en UTF8. En voici un extrait du contenu :
nom,prenom,tel,email,region ALAOUI EL HICHAMI,tisha,06.58.88.39.31,alaouielhichami.tisha@wanadoo.fr,Nouvelle Aquitaine CHEN KUO CHANG,jerrie,+337 38 11 47 12,,Île deFrance KAMOLIN,hohepa,0615842032,kamolin.hohepa@yahoo.com,Hauts de France DE MAULEON DE BRUYERES,aphrodisios,07 01 96 99 77,Kyo@truc.eu,Bretagne MILANDOU ANGAYI,fredo,,milandouangayi.fredo@truc.eu,Hauts de France RAMARETY,shifra,06 45 79 77 18,ramarety.shifra@bouygues.fr, LOZAC HMEUR,nigelia,06.45.27.24.71,nnigelia@yahoo.com,HAUTS DE FRANCE KWINTEN,katrien,0769042384,NoScopeGod@exemple.com,GRAND EST HAULIN,alyona,06.69.04.31.76,haulin.alyona@secret.com,auvergne - rhônes alpes ,sigfrid,+337 73 10 35 57,ssigfrid@exemple.com,bretagne STANISIC,gavril,06 61 33 84 21,stanisic.gavril@cegetel.com,bretagne RALAIZEFA,feardorcha,0682313632,ralaizefa.feardorcha@gmail.com,Core ...
Vous pouvez constater que ce fichier pose divers problèmes.
* Il manque certaines données * Il peut y avoir des doublons * L'écriture des données n'est pas unifiée (formats de téléphones variables, etc.) * Il peut y avoir des fautes, notamment dans certaines régions
Il y en a 1000 (mais il pourrait y en avoir 10000 ou 100 000 !) aussi préférerait-on ne pas avoir à écrire à la main.
Ouvrir le fichier
Utilisez le module csv pour ouvrir le fichier et en extraire les données.
Vous produirez une liste liste donc chaque ligne est un dictionnaire correspondant à une ligne du fichier.
Homogénéiser les numéros
Écrire une fonction qui reçoit un numéro de téléphone sous une de ces différentes formes présentes dans le fichier et qui renvoie une forme standard : "0612345678"
Vous devez écrire une fonction clean_tel(tel) qui reçoit le numéro de téléphone, éventuellement vide, et qui renvoie le numéro sous sa forme standard.
Homogénéiser les régions
Les régions sont écrites de façons variées et contiennent éventuellement des fautes mineures (caractère manquant)
Les bons noms de régions sont :
["Île de France", "Occitanie", "Bretagne", "Grand Est", "Hauts de France", "Pays de la Loire", "Auvergne - Rhônes Alpes", "Nouvelle Aquitaine", "Centre", "Corse", "Normandie", "Bourgogne"]
Il peut arriver que le nom de région soit manquant. Dans ce cas, on ne fait rien.
Il peut arriver que la région ne soit pas écrit comme il faut. Par exemple "il de frce" ou "ile de france"… Dans ce cas, il faut le corriger.
Vous disposez dans le module distance.py d'une fonction distance(motA, motB). Cette fonction permet de donner une évaluation de la distance entre deux mots. Si vous trouvez une région qui n'est pas correcte, comme "il de frce" vous devez chercher le nom de région le plus proche.
Par exemple on a :
distance("Île de France", "il de frce") < distance("Bourgogne", "il de frce")
ce qui traduit le fait que "il de frce" est plus proche de "Île de France" que de "Bourgogne".
La fonction distance vous permet donc d'automatiser la correction des noms de régions.
Vous devez écrire une fonction clean_region(region) qui reçoit un nom de région éventuellement mal écrit et qui renvoie le nom de région correspondant. Dans le cas où region est vide, la fonction doit renvoyer une chaîne vide.
Supprimer les doublons
On peut considérer que les paires [Nom, prénom] sont uniques de même que les numéro de téléphone et les emails. Pourtant le fichier contient des doublons : même numéro dans plusieurs lignes, même email dans plusieurs lignes…
Prenons un exemple :
ZERANI,diodotus,0783305420,,bourgogn ... ZERANI,diodotus,07 83 30 54 20,zerani.diodotus@secret.com,
Ces deux lignes ont même numéro de téléphone (bien que écrit différemment) et même [Nom, prénom]. Elles concernent une même personne. Vous pouvez voir que dans la première occurrence manque l'email et dans la seconde manque la région.
La première étape aura transformé ces lignes en dictionnaires, puis les deux opérations précédents auront rectifié les numéros et régions de sorte que nous aurons :
{"nom":"ZERANI", "prenom":"diodotus", "tel":"0783305420", "email":"", "region":"Bourgogne"}
...
{"nom":"ZERANI", "prenom":"diodotus", "tel":"0783305420", "email":"zerani.diodotus@secret.com", "region":"" }
Il faudra fusionner ces deux lignes pour n'en garder qu'une seule :
{"nom":"ZERANI", "prenom":"diodotus", "tel":"0783305420", "email":"zerani.diodotus@secret.com", "region":"Bourgogne" }
Vous devez faire ce travail automatiquement, avec une ou plusieurs fonctions.
Trier
Critère de tri
Écrire une fonction critere(item) qui reçoit un item de la liste, c'est à dire un dictionnaire représentant un individu.
Exemple :
{ "nom":"ZERANI", "prenom":"diodotus", "tel":"0783305420", "email":"zerani.diodotus@secret.com", "region":"Bourgogne" }
Et qui renvoie nomprenom, c'est à dire dans l'exemple :
"ZERANIdiodotus"
Tri
Utilisez la méthode sort pour trier la liste selon le critère.
liste.sort(key=critere)
Enregistrer le fichier propre
Maintenant que les données sont nettoyées et triées vous allez pouvoir l'enregistrer sous forme d'un fichier csv.
Choisissez un nouveau nom pour ne pas détruire le fichier d'origine.
DESCRIPTEURS = ["nom", "prenom", "tel", "email", "region"]
with open("clean_personnes.csv", "w", encoding="utf8", newline='') as f:
# en l'absence de newline = '', ajoute des lignes vides inutiles
writer = csv.DictWriter(f, delimiter=',', fieldnames = DESCRIPTEURS )
writer.writeheader() # écrit la ligne d'entête
writer.writerows(liste) # écrit l'ensemble des personnes
