L'informatique est utilisée de nos jours pour le traitement de quantités importantes de données : commerce en ligne, bases de données pour des dizaine de milliers d'articles du commerce en ligne, des millions de clients, de commandes, etc.
Les systèmes de gestion de base de données sont des programmes hautement spécialisés pour effectuer ce genre de tâches mais nous allons voir dans ce cours qu'il est facile de mettre en œuvre les opérations de base de ces système dans un langage de programmation comme Python.
Les bases de données relationnelles (BDR) qui contiennent un ensemble de tables contenant des données reliées entre elles (on parle de relations) et le langage SQL permettant d'effectuer des requêtes dans ces tables ne seront étudiées qu'en terminale NSI.
ISO-alpha2;ISO-alpha3;ISO-numeric;fips;Country;Capital;Area;Population;Continent
AD;AND;20;AN;Andorra;Andorra la Vella;468.0;84;EU
AE;ARE;784;AE;United Arab Emirates;Abu Dhabi;82,880.0;4,975,593;AS
AF;AFG;4;AF;Afghanistan;Kabul;647,500.0;29,121,286;AS
AG;ATG;28;AC;Antigua and Barbuda;St. John's;443.0;86,754;NA
AI;AIA;660;AV;Anguilla;The Valley;102.0;13,254;NA
AL;ALB;8;AL;Albania;Tirana;28,748.0;2,986,952;EU
...
Le module natif csv de Python permet d'importer les données depuis un fichier CSV.
Voici un script permettant de charger le fichier countries.csv avec des points-virgules comme délimitations.
import csv
with open('countries.csv', newline='', encoding='utf-8') as csvfile:
pays = list(csv.reader(csvfile, delimiter=';'))
pays[0]
?
pays[1]
?
import csv
with open('countries.csv', newline='', encoding='utf-8') as csvfile:
pays = list(csv.DictReader(csvfile, delimiter=';'))
pays[0]
?
resultat = [p['country'] for p in pays if p['continent'] == 'EU']
resultat
.resultat = [p['continent'] for p in pays]
resultat
.On obtient une liste avec beaucoup de répétitions. Pour supprimer tous ces doublons, il est possible de transformer cette liste en un ensemble (appelé set en anglais).
La fonction native set()
permet de convertir une liste en un set pour éliminer les doublons.
resultat = set([p['continent'] for p in pays])
resultat
.
sorted(list)
(voir doc python) qui retourne une copie de la liste triée ou la méthode list.sort()
(voir doc python) qui trie la liste sur place.
key
qui est la fonction permettant d'évaluer les éléments de la liste afin de les classer selon leur scorereverse
qui est un boolean (par défaut False
) permettant de trie selon l'ordre décroissant (True
).Par exemple, si l'on veut trier les pays selon leur superficie : il faut d'abord définir une fonction qui permet d'accéder à la valeur de l'attribut 'area' d'un enregistrement puis retourne le score de l'enregistrement afin qu'il puisse être comparé aux autres et ainsi trier la liste entière.
def cle_superficie(p):
return p['area']
pays.sort(key=cle_superficie, reverse=True) # tri
top5 = [(p['country'], p['area']) for p in pays[:5]] # extraction
for p in top5 : # affichage
print(p)
def cle_continent_pop(p):
return (p['continent'], p['population'])
def cle_population(p):
return int(p['population'].replace(",", ""))
def cle_continent(p):
return p['continent']
pays.sort(key=cle_population, reverse=True) # tri par population
pays.sort(key=cle_continent) # tri par continent
resultat = [(p['country'], p['continent'], p['population'])
for p in pays if int(p['population'].replace(",", "")) >= 50000000] # extraction
for p in resultat : # affichage
print(p)
Les données étant importées sous la forme d'une liste. Fusionner deux tables revient à concaténer deux listes.
La dernière étape est de sauvegarder cette nouvelle liste de dictionnaire dans un nouveau fichier CSV 'nom_fichier.csv',
ce qui est réalisable avec le script suivant :
with open('nom_fichier.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = list(liste_fusionnee[0].keys())
writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=';')
writer.writeheader()
for p in liste_fusionnee:
writer.writerow(p)
liste_fusionnee
.
'w'
donné à la fonction open('nom_fichier.csv', 'w', newline='', encoding='utf-8')
permet d'ouvrir le fichier en mode écriture (write). Par défaut ce paramètre est en mode lecture ('r'
pour read).villes_sup100.csv
.
Pour fusionner deux tables, il est impératif qu'elles aient au moins un attribut en commun qui servira de pont entre elles.
Cet attribut doit permettre d'identifier de façon unique un enregistrement : on l'appelle un identifiant.
Il existe plusieurs façon de joindre des tables :
Nom de la fusion | interne | externe gauche | externe droite | externe entière |
---|---|---|---|---|
Explications | Prend seulement les enregistrements des deux tables qui sont associables. | Prend tous les enregistrements de gauche et y associe les enregistrement de droite quand c'est possible, sinon complète la table avec la valeur NULL . | Prend tous les enregistrements de droite et y associe les enregistrement de gauche quand c'est possible, sinon complète la table avec la valeur NULL . | Prend tous les enregistrements des deux tables en les associant quand c'est possible, sinon complète la table avec la valeur NULL. |
Schéma |
Exemple :
Nous disposons de deux tables :
Nom | Courriel |
---|---|
PICHO | trailin@new.com |
MARTIN | rwyt@kitin.com |
KERROUC | kishimoto@kitin.com |
MAS | vovivano@not.com |
Pseudo | Courriel | Orientation politique |
---|---|---|
Naruto | kishimoto@kitin.com | extrème gauche |
AllezLeStade | linkymaster@not.com | droite |
123456789 | milou@not.com | droite |
GenerationM | trailin@new.com | centre |
Tocamélos | rwyt@kitin.com | gauche |