Comprendre la fusion

ExempleDes clients et leurs commandes

On dispose de 2 fichiers téléchargeables ci-dessous :

  1. client.csv

  2. 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éthodeFusion

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.

1
import csv
2
3
def de_csv_vers_dico(fichier):
4
    """
5
    fichier -- nom d'un fichier csv (sans l'extension) 
6
7
    renvoie la liste de dictionnaires associée au fichier.
8
    """
9
    with open(fichier + '.csv', newline='') as fichiercsv:
10
        lecture = csv.DictReader(fichiercsv, delimiter=',')
11
        return [ligne for ligne in lecture]
12
13
# lecture des deux tables et stockage dans des listes:
14
clients = de_csv_vers_dico('client')
15
commandes = de_csv_vers_dico('commande')
16
17
# création de la liste fusion:
18
liste = []
19
for commande in commandes:
20
    for client in clients:
21
        if commande['id_client'] == client['id_client']:
22
            dico = {'id_client': client['id_client'],
23
                    'nom': client['nom'],
24
                    'prénom': client['prénom'],
25
                    'id_commande': int(commande['id_commande']), # transfo en entier pour le tri
26
                    'descriptif': commande['descriptif']                    
27
            }
28
            liste.append(dico)
29
30
# A vous de visualiser le résultat avec des appels à la fonction print
31

MéthodeTri 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.

1
import csv
2
3
def de_csv_vers_dico(fichier):
4
    """
5
    fichier -- nom d'un fichier csv (sans l'extension) 
6
7
    renvoie la liste de dictionnaires associée au fichier.
8
    """
9
    with open(fichier + '.csv', newline='') as fichiercsv:
10
        lecture = csv.DictReader(fichiercsv, delimiter=',')
11
        return [ligne for ligne in lecture]
12
13
# lecture des deux tables et stockage dans des listes:
14
clients = de_csv_vers_dico('client')
15
commandes = de_csv_vers_dico('commande')
16
17
# création de la liste fusion:
18
liste = []
19
for commande in commandes:
20
    for client in clients:
21
        if commande['id_client'] == client['id_client']:
22
            dico = {'id_client': client['id_client'],
23
                    'nom': client['nom'],
24
                    'prénom': client['prénom'],
25
                    'id_commande': int(commande['id_commande']), # transfo en entier pour le tri
26
                    'descriptif': commande['descriptif']                    
27
            }
28
            liste.append(dico)
29
30
# on trie le résultat suivant l'ordre imposé dans l'énoncé:
31
liste.sort(key= lambda x:x['id_commande'])
32
liste.sort(key= lambda x:x['nom'])
33
34
# A vous de visualiser le résultat avec des appels à la fonction print
35

MéthodeStockage 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).

1
def de_dico_vers_csv(liste, nomFichier):
2
    """
3
    liste -- liste de dictionnaires
4
    nomFichier -- nom du fichier à créer (sans extension)
5
6
    crée le fichier csv contenant les contenus des dictionnaires 
7
    """
8
    # création et ouverture en écriture:
9
    with open(nomFichier + '.csv', 'w', newline='') as fichiercsv:
10
11
        # création de la ligne d'entête (noms des colonnes):
12
        entete = [clef for clef in liste[0].keys()]
13
14
        ecriture = csv.DictWriter(fichiercsv, fieldnames=entete)
15
        ecriture.writeheader()
16
        # écriture  des dictionnaires de la liste dans le fichier:
17
        for ligne in liste:
18
            ecriture.writerow(ligne)
1
import csv
2
3
def de_csv_vers_dico(fichier):
4
    """
5
    fichier -- nom d'un fichier csv (sans l'extension) 
6
7
    renvoie la liste de dictionnaires associée au fichier.
8
    """
9
    with open(fichier + '.csv', newline='') as fichiercsv:
10
        lecture = csv.DictReader(fichiercsv, delimiter=',')
11
        return [ligne for ligne in lecture]
12
13
def de_dico_vers_csv(liste, nomFichier):
14
    """
15
    liste -- liste de dictionnaires
16
    nomFichier -- nom du fichier créé (sans extension)
17
18
    crée le fichier csv contenant les contenus des dictionnaires 
19
    """
20
    with open(nomFichier + '.csv', 'w', newline='') as fichiercsv:
21
        entete = [clef for clef in liste[0].keys()]
22
        ecriture = csv.DictWriter(fichiercsv, fieldnames=entete)
23
        ecriture.writeheader()
24
        for ligne in liste:
25
            ecriture.writerow(ligne)
26
27
# lecture des deux tables et stockage dans des listes:
28
clients = de_csv_vers_dico('client')
29
commandes = de_csv_vers_dico('commande')
30
31
32
# création de la liste  fusion:
33
liste = []
34
for commande in commandes:
35
    for client in clients:
36
        if commande['id_client'] == client['id_client']:
37
            dico = {'id_client': client['id_client'],
38
                    'nom': client['nom'],
39
                    'prénom': client['prénom'],
40
                    'id_commande': int(commande['id_commande']), # transfo en entier pour le tri
41
                    'descriptif': commande['descriptif']                    
42
            }
43
            liste.append(dico)
44
45
# on trie le résultat suivant l'ordre imposé dans l'énoncé:
46
liste.sort(key= lambda x:x['id_commande'])
47
liste.sort(key= lambda x:x['nom'])
48
49
# on lance la création du fichier csv pour stockage du résultat:
50
de_dico_vers_csv(liste, 'clients_commandes')