Comprendre la fusion
Exemple : Des clients et leurs commandes
On dispose de 2 fichiers téléchargeables ci-dessous :
client.csv
commande.csv
Contenu :
id_client | nom | prénom |
1 | Bagou | Albert |
2 | Charabia | Barnabé |
3 | Blabla | Casimir |
4 | Paulitik | Zoé |
5 | Escro | Virgil |
6 | Manteux | Rémi |
Le champ id_client fait référence au champ de même nom du fichier client.
Par exemple, la commande ayant l'id_commande égal à 1 a été faite par la personne id_client = 2, c'est à dire par Charabia Barnabé.
Contenu :
id_commande | id_client | descriptif |
1 | 2 | bouilloire |
2 | 3 | Livre Apprende Python |
3 | 2 | Livre Apprendre HTML |
4 | 4 | livre Apprendre CSS |
5 | 6 | couverture |
6 | 4 | VTT |
7 | 4 | smartphone |
8 | 1 | cahiers |
9 | 2 | Livre Le réseau internet |
10 | 3 | Livre Les systèmes d’exploitation |
11 | 1 | livre Algorithmique |
Méthode : Fusion
On aimerait les fusionner. Plus précisément, on vous demande de construire une liste de dictionnaires dans laquelle chaque dictionnaire se présente ainsi :
{'id_client': ..., 'nom': ..., 'prénom': ..., 'id_commande': ..., 'descriptif': ...}.
Bien sûr dans cette ligne, la commande doit avoir été faite par le client, ce qui signifie que l'identifiant client de la commande est bien l'identifiant du client correspondant aux nom et prénom obtenus.
Un client qui n'a pas fait de commande n'apparaîtra pas dans cette liste.
import csv
def de_csv_vers_dico(fichier):
"""
fichier -- nom d'un fichier csv (sans l'extension)
renvoie la liste de dictionnaires associée au fichier.
"""
with open(fichier + '.csv', newline='') as fichiercsv:
lecture = csv.DictReader(fichiercsv, delimiter=',')
return [ligne for ligne in lecture]
# lecture des deux tables et stockage dans des listes:
clients = de_csv_vers_dico('client')
commandes = de_csv_vers_dico('commande')
# création de la liste fusion:
liste = []
for commande in commandes:
for client in clients:
if commande['id_client'] == client['id_client']:
dico = {'id_client': client['id_client'],
'nom': client['nom'],
'prénom': client['prénom'],
'id_commande': int(commande['id_commande']), # transfo en entier pour le tri
'descriptif': commande['descriptif']
}
liste.append(dico)
# A vous de visualiser le résultat avec des appels à la fonction print
Méthode : Tri de la fusion
Ordonnez la liste obtenue après fusion suivant l'ordre croissant des noms des clients et pour un même client suivant l'ordre croissant des id_commande.
import csv
def de_csv_vers_dico(fichier):
"""
fichier -- nom d'un fichier csv (sans l'extension)
renvoie la liste de dictionnaires associée au fichier.
"""
with open(fichier + '.csv', newline='') as fichiercsv:
lecture = csv.DictReader(fichiercsv, delimiter=',')
return [ligne for ligne in lecture]
# lecture des deux tables et stockage dans des listes:
clients = de_csv_vers_dico('client')
commandes = de_csv_vers_dico('commande')
# création de la liste fusion:
liste = []
for commande in commandes:
for client in clients:
if commande['id_client'] == client['id_client']:
dico = {'id_client': client['id_client'],
'nom': client['nom'],
'prénom': client['prénom'],
'id_commande': int(commande['id_commande']), # transfo en entier pour le tri
'descriptif': commande['descriptif']
}
liste.append(dico)
# on trie le résultat suivant l'ordre imposé dans l'énoncé:
liste.sort(key= lambda x:x['id_commande'])
liste.sort(key= lambda x:x['nom'])
# A vous de visualiser le résultat avec des appels à la fonction print
Méthode : Stockage du résultat dans un fichier
Avec la liste obtenue par fusion, vous créerez un fichier CSV, en utilisant DictWriter. Il vous faudra commencer par lire la documentation associée.
Code pour créer le fichier avec dictionnaires
Une fonction pour créer un fichier CSV à partir d'une liste de dictionnaires (présentant les mêmes champs).
def de_dico_vers_csv(liste, nomFichier):
"""
liste -- liste de dictionnaires
nomFichier -- nom du fichier à créer (sans extension)
crée le fichier csv contenant les contenus des dictionnaires
"""
# création et ouverture en écriture:
with open(nomFichier + '.csv', 'w', newline='') as fichiercsv:
# création de la ligne d'entête (noms des colonnes):
entete = [clef for clef in liste[0].keys()]
ecriture = csv.DictWriter(fichiercsv, fieldnames=entete)
ecriture.writeheader()
# écriture des dictionnaires de la liste dans le fichier:
for ligne in liste:
ecriture.writerow(ligne)
import csv
def de_csv_vers_dico(fichier):
"""
fichier -- nom d'un fichier csv (sans l'extension)
renvoie la liste de dictionnaires associée au fichier.
"""
with open(fichier + '.csv', newline='') as fichiercsv:
lecture = csv.DictReader(fichiercsv, delimiter=',')
return [ligne for ligne in lecture]
def de_dico_vers_csv(liste, nomFichier):
"""
liste -- liste de dictionnaires
nomFichier -- nom du fichier créé (sans extension)
crée le fichier csv contenant les contenus des dictionnaires
"""
with open(nomFichier + '.csv', 'w', newline='') as fichiercsv:
entete = [clef for clef in liste[0].keys()]
ecriture = csv.DictWriter(fichiercsv, fieldnames=entete)
ecriture.writeheader()
for ligne in liste:
ecriture.writerow(ligne)
# lecture des deux tables et stockage dans des listes:
clients = de_csv_vers_dico('client')
commandes = de_csv_vers_dico('commande')
# création de la liste fusion:
liste = []
for commande in commandes:
for client in clients:
if commande['id_client'] == client['id_client']:
dico = {'id_client': client['id_client'],
'nom': client['nom'],
'prénom': client['prénom'],
'id_commande': int(commande['id_commande']), # transfo en entier pour le tri
'descriptif': commande['descriptif']
}
liste.append(dico)
# on trie le résultat suivant l'ordre imposé dans l'énoncé:
liste.sort(key= lambda x:x['id_commande'])
liste.sort(key= lambda x:x['nom'])
# on lance la création du fichier csv pour stockage du résultat:
de_dico_vers_csv(liste, 'clients_commandes')