Les données structurées

Les fichiers de 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 textes 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 ( nous le verrons plus tard...)

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.

SimulationObservons une collection

Téléchargez et ouvrez ce fichier 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 )

Choix de l'encodage

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

  • Quels sont les descripteurs ?

  • Combien d'établissements sont dans cette collection ?

  • Trouvez la ligne correspondant à votre lycée.

  • Trouvez la ligne correspondant à l'école où vous avez appris à lire.

  • 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...

SimulationFaisons ces mêmes recherches avec un programme.

Nous travaillerons avec Processing

Téléchargez ce fichier

Ouvrez Processing en mode Python

Glissez-déposez le fichier dans Processing.

On écrit le code suivant :

La première ligne charge le fichier dans la variable table et précise que les éléments de la première ligne sont des descripteurs.

La seconde affiche le nombre de lignes ( donc le nombre d'établissements).

1
table=loadTable("data/lycee2.csv","header")
2
print(table.getRowCount())

Et cette ligne supplémentaire permet d'obtenir le nombre de colonnes.

1
table=loadTable("data/lycee2.csv","header")
2
print(table.getRowCount())
3
print(table.getColumnCount())

Faisons afficher les informations de notre lycée : Jean moulin de Draguignan.

Son numéro_uai est 0830015R.

Dans le code ci-dessous :

  • On trouve et on stocke dans "resultat" les éléments de la ligne qui contient ce numéro avec : resultat=table.findRow("0830015R","numero_uai")

  • Puis on affiche les différents éléments de cette ligne à l'aide de leurs descripteurs :

1
table=loadTable("data/lycee2.csv","header")
2
print(table.getRowCount())
3
print(table.getColumnCount())
4
resultat=table.findRow("0830015R","numero_uai")
5
print(resultat.getString("appellation_officielle"))
6
print(resultat.getString("adresse_uai"))
7
print(resultat.getString("code_postal_uai"))
8
print(resultat.getString("localite_acheminement_uai"))
  • Essayez avec ce numéro : 0830015S

SimulationEt 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.

Le descripteur : "localite_acheminement_uai", donne la ville de l'établissement, on va donc faire une recherche suivant ce descripteur.

Le problème c'est qu'il y a sans doute plusieurs établissements dans cette localité.

  • On va donc utiliser une boucle qui testera toutes les lignes de la table

De plus il va falloir comparer deux textes...et parfois le nom de la ville c'est par exemple :DRAGUIGNAN et dans le fichier il y a : DRAGUIGNAN CEDEX

  • On va utiliser une fonction qui compare les contenus et qui renvoie False si le nom n'est pas dans la phrase et True sinon

Les éléments de la ligne testée sont dans la variable tmp, vous devez compléter ce programme, pour qu'il affiche les informations voulues quand le test est "True"

1
def setup():
2
    table=loadTable("data/lycee2.csv","header")
3
    print(table.getRowCount())
4
    print(table.getColumnCount())
5
    nom="DRAGUIGNAN"
6
    for i in range(table.getRowCount()):
7
        tmp=table.getRow(i)
8
        localite=tmp.getString("localite_acheminement_uai")
9
        test=compare(localite.split(" "),nom.split(" "))
10
        if test==True:
11
            print("****************************************************************************************")
12
            print(tmp.getString("numero_uai"))
13
           # partie à compléter
14
    
15
def compare(phrase,mots):
16
    for mot in mots:  #pour les "mot" se trouvant dans "mots"
17
        if mot not in phrase:  #s'il ne sont pas dans la phrase
18
            return False
19
        else:
20
            return True
21
        
22
    
  • Essayez avec DRAGUIGNAN CEDEX

  • Essayez avec CEDEX

localite.split(" ") signifie que l'on précise que le séparateur de mot dans localite est un espace.

La variable test est en informatique ce que l'on appelle un booléen, c'est à dire une variable qui peut avoir deux valeurs : vraie ou fausse.

ComplémentCorrigé

1
2
def setup():
3
    table=loadTable("data/lycee2.csv","header")
4
    print(table.getRowCount())
5
    print(table.getColumnCount())
6
    nom="DRAGUIGNAN"
7
    for i in range(table.getRowCount()):
8
        tmp=table.getRow(i)
9
        localite=tmp.getString("localite_acheminement_uai")
10
        test=compare(localite.split(" "),nom.split(" "))
11
        if test==True:
12
            print("****************************************************************************************")
13
            print(tmp.getString("numero_uai"))
14
            print(tmp.getString("appellation_officielle"))
15
            print(tmp.getString("adresse_uai"))
16
            print(tmp.getString("code_postal_uai"))
17
            print(tmp.getString("localite_acheminement_uai"))
18
    
19
def compare(phrase,mots):
20
    for mot in mots:
21
        if mot not in phrase:
22
            return False
23
        else:
24
            return True
25

SimulationLe même travail avec EduPython

Téléchargez ce fichier

Ouvrez EduPython

Dans un dossier contenant le fichier que vous venez de télécharger 

Écrivez et enregistrez le programme suivant :

1
2
import csv
3
4
# chargement du fichier csv en utilisant la biblio csv
5
with open('lycee2.csv','r', encoding='utf-8') as f:
6
    premiere_ligne = f.readline()
7
    print("Les descripteurs de la collection des établissements scolaires :")
8
    print(premiere_ligne)
9
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
10
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))
11
12
# on met le tout dans une liste
13
liste=[]
14
for ligne in data_lignes:
15
    liste.append(ligne)
16
17
print(liste[1])

Exécutez le programme 

Vous devriez voir dans la console :

1
Les descripteurs de la collection des établissements scolaires :
2
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,,,,,,,
3
4
['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 : Jean moulin de Draguignan.

Son numéro_uai est : 0830015R.

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 correspondante

1
2
import csv
3
4
# chargement du fichier txt en utilisant la biblio csv
5
with open('lycee2.csv','r', encoding='utf-8') as f:
6
    premiere_ligne = f.readline()
7
    print("Les descripteurs de la collection des établissements scolaires :")
8
    print(premiere_ligne)
9
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
10
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))
11
12
# on met le tout dans une liste
13
liste=[]
14
for ligne in data_lignes:
15
    liste.append(ligne)
16
17
#print(liste[1])
18
# on parcourt la liste en recherchant le n° uai de notre lycée
19
for el in liste:
20
    if el[0]=="0830015R":
21
        print(el)

Travail à faire :

Faites afficher l'adresse au complet de notre lycée. ( La ville se trouve à el[9] )

  • Essayez avec ce numéro : 0830015S

ComplémentCorrigé

1
2
import csv
3
4
# chargement du fichier txt en utilisant la biblio csv
5
with open('lycee2.csv','r', encoding='utf-8') as f:
6
    premiere_ligne = f.readline()
7
    print("Les descripteurs de la collection des établissements scolaires :")
8
    print(premiere_ligne)
9
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
10
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))
11
12
# on met le tout dans une liste
13
liste=[]
14
for ligne in data_lignes:
15
    liste.append(ligne)
16
17
#print(liste[1])
18
19
for el in liste:
20
    if el[0]=="0830015R":
21
        print(el)
22
        print(el[1])
23
        print(el[7]," ",el[5])
24
        print(el[8])
25
        print(el[9])

SimulationEt 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

1
2
import csv
3
4
# chargement du fichier txt en utilisant la biblio csv
5
with open('lycee2.csv','r', encoding='utf-8') as f:
6
    premiere_ligne = f.readline()
7
    print("Les descripteurs de la collection des établissements scolaires :")
8
    print(premiere_ligne)
9
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
10
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))
11
12
# on met le tout dans une liste
13
liste=[]
14
for ligne in data_lignes:
15
    liste.append(ligne)
16
17
s=input('Entrez un nom de ville:')
18
19
s=s.upper()
20
# On parcourt la liste et si le nom de la ville est dans el[9], on affiche les résultats
21
for el in liste:
22
    if s  in el[9]:
23
        print("================================================")
24
        print(el)

Travail à faire :

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

ComplémentCorrigé

1
2
import csv
3
4
# chargement du fichier txt en utilisant la biblio csv
5
with open('lycee2.csv','r', encoding='utf-8') as f:
6
    premiere_ligne = f.readline()
7
    print("Les descripteurs de la collection des établissements scolaires :")
8
    print(premiere_ligne)
9
    dialecte_fichier_csv = csv.Sniffer().sniff(premiere_ligne)
10
    data_lignes = list(csv.reader(f, dialect=dialecte_fichier_csv))
11
12
# on met le tout dans une liste
13
liste=[]
14
for ligne in data_lignes:
15
    liste.append(ligne)
16
17
s=input('Entrez un nom de ville:')
18
19
s=s.upper()
20
21
for el in liste:
22
    if s  in el[9]:
23
        print("===============================================================")
24
        print(el[1])
25
26
        print(el[7]," ",el[5])
27
        print(el[8])
28
        print(el[9])
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Stéphan Van Zuijlen Licence de documentation libre GNURéalisé avec Scenari (nouvelle fenêtre)