Activité 3: Python pour traiter les données

 

Le format csv

Les collections de données sont souvent des fichiers aux formats csv (comma separated values), c'est à dire des fichiers texte où les données sont séparées par des virgules.

Ce qui donne par exemple :
"Prenom","Nom","Email","Age"
"Jean", "Petit", "jean@monsite.fr", "34"
"Anne", "Le Gall", "anne@exemple.net", "21"
"Pierre", "Diawara", "pierre@sonsite.com", "44"

Il existe d'autres formats (voir ici)
Ces fichiers s'ouvrent avec un tableur, cependant le célèbre Excel ne lit correctement que des fichiers .csv où le séparateur est un point-virgule. Tandis que Libre-Office-calc, lit correctement tous les fichiers.

Observons une collection

Téléchargez et ouvrez le fichier "lycee2.csv" avec Excel et observez que l'affichage n'est pas celui que nous attendons d'un fichier de donnée...
Ouvrez-le avec Libre-office calc en choisissant un encodage en "UTF-8" ( pour un affichage normal des caractères accentués )

Il s'agit de tous les établissements scolaires de France ...

Questions 1: Quels sont les descripteurs ?
Questions 2: Combien d'établissements sont dans cette collection ?
Questions 3: Trouvez la ligne correspondant à votre lycée.
Questions 4: Trouvez la ligne correspondant à l'école où vous avez appris à lire.
Questions 5: Trouvez combien d'établissements se trouvent dans une ville de votre choix.

Vous avez sans doute constaté que ce n'est pas si simple d'obtenir ces informations...

Faisons ces mêmes recherches avec un programme python

Créer un dossier "Données structurées" sur le bureau.
Copier le fichier lycee2.csv dans ce dossier
Ouvrez le logiciel EduPython
Écrivez et enregistrez le programme suivant dans le dossier "Données structurées" en le nommant "programme1.py"

import csv
# chargement du fichier csv en utilisant la biblio csv
with open('lycee2.csv','r', encoding='utf-8') as f:
    premiere_ligne = f.readline()
    print("Les descripteurs de la collection des établissements scolaires :")
    print(premiere_ligne)
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))

# on met le tout dans une liste

liste=[]
for ligne in data_lignes:
    liste.append(ligne)
print(liste[1])

Enregistrer puis exécutez le programme
Vous devriez voir dans la Console Python:

Les descripteurs de la collection des établissements scolaires :
numero_uai,appellation_officielle,denomination_principale,patronyme_uai,secteur_public_prive_libe,adresse_uai,lieu_dit_uai,boite_postale_uai,code_postal_uai,localite_acheminement_uai,

coordonnee_x,coordonnee_y,appariement,localisation,nature_uai,nature_uai_libe,etat_etablissement,,,,,,,

['0010002X', 'Collège Saint-Exupéry', 'COLLEGE', 'SAINT-EXUPERY', 'Public', '6  RUE AGUETANT', '', '508', '1500', 'AMBERIEU EN BUGEY', '882408', '3', '6543019', '6', 'MANUEL', 'BATIMENT', '340', 'Collège', '1', '', '', '', '', '']

 

Comme vous le constatez, le premier élément de chaque 'sous-listes' de la liste est le n° uai :
Faisons afficher les informations de notre lycée : Claude Lebois à St Chamond
Son numéro_uai est : 0420040R.

Dans le code ci-dessous :
On recherche avec une boucle le n° uai de notre lycée, si on le trouve on fait afficher la liste correspondant

import csv
# chargement du fichier txt en utilisant la biblio csv

with open('lycee2.csv','r', encoding='utf-8') as f:
    premiere_ligne = f.readline()
    print("Les descripteurs de la collection des établissements scolaires :")
    print(premiere_ligne)
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))

# on met le tout dans une liste

liste=[]
for ligne in data_lignes:
    liste.append(ligne)

# on parcourt la liste en recherchant le n° uai de notre lycée

for el in liste:
    if el[0]=="0420040R":
        print(el)

Exécutez le programme
Vous devriez voir dans la Console Python:

Les descripteurs de la collection des établissements scolaires :
numero_uai,appellation_officielle,denomination_principale,patronyme_uai,secteur_public_prive_libe,adresse_uai,lieu_dit_uai,boite_postale_uai,code_postal_uai,localite_acheminement_uai,

coordonnee_x,coordonnee_y,appariement,localisation,nature_uai,nature_uai_libe,etat_etablissement,,,,,,,

['0010002X', 'Collège Saint-Exupéry', 'COLLEGE', 'SAINT-EXUPERY', 'Public', '6  RUE AGUETANT', '', '508', '1500', 'AMBERIEU EN BUGEY', '882408', '3', '6543019', '6', 'MANUEL', 'BATIMENT', '340', 'Collège', '1', '', '', '', '', '']

Question 6

Modifier le programme ci dessus pour faire afficher l'adresse au complet de notre lycée. 

  • L'appelation officielle se trouve à el[1]
  • La boite postale nommé boite_postale_uai se trouve à el[7]
  • L'adresse nomméé adresse_uai se trouve à el[5]
  • Le code postal nommé code_postal_uai se trouve à el[8]
  • La ville nommé  localite_acheminement_uai se trouve à el[9] 

Exécutez le programme
Vous devriez voir dans la Console Python:

Lycée général et technologique Claude Lebois - Lycée des métiers transport et logistique - Lycée des métiers chaudronnerie et usinage
BP 128   8 BOULEVARD ALAMAGNY
42403   ST CHAMOND CEDEX

 

Et si on ne connaît pas le numéro uai

Il est fort probable que vous ne connaissiez pas le numéro uai de votre école.
Vous vous souvenez probablement de la ville dans laquelle vous avez appris à lire.

On accède à la ville avec el[9]
Le code ci-dessous :

  • demande à l'utilisateur le nom d'une ville
  • affiche le numéro uai des établissements scolaires de cette ville
import csv
# chargement du fichier txt en utilisant la biblio csv
with open('lycee2.csv','r', encoding='utf-8') as f:
    premiere_ligne = f.readline()
    print("Les descripteurs de la collection des établissements scolaires :")
    print(premiere_ligne)
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))

# on met le tout dans une liste
liste=[]
for ligne in data_lignes:
    liste.append(ligne)

#on demande à l'utilisateur le nom de la ville
s=input('Entrez un nom de ville:')
s=s.upper()

# On parcourt la liste et si le nom de la ville est dans el[9], on affiche les résultats
for el in liste:
    if s  in el[9]:
        print("================================================")
        print(el)
Exécutez le programme, et testez le avec différents noms de villes

Question 7

Faire afficher les adresses complètes de tous les établissements d'une ville