Des acteurs et leurs rôles
On utilise pour cet exercice 3 tables en téléchargement ci-dessous :
la table personna.csv
la table joue.csv
la table film.csv
Contenu :
id_personne | nom | prenom |
1 | Brasseur | Claude |
2 | Boon | Dany |
3 | Goldblum | Jeff |
4 | Reno | Jean |
5 | Balasko | Josiane |
6 | Olivares | Gerardo |
7 | Emmerich | Roland |
8 | Kidmann | Nicole |
9 | Kubrick | Stanley |
10 | Cruise | Tom |
11 | McQuarrie | Christopher |
12 | Spielberg | Steven |
13 | Ford | Harrison |
14 | Abrams | JJ |
15 | Merad | Kad |
16 | Rich | Claude |
17 | Tavernier | Bertrand |
18 | Robert | Yves |
19 | Berri | Claude |
20 | Aghion | Gabriel |
21 | Darmon | Gérard |
22 | Laroque | Michèle |
id_realisateur fait référence à id_personne de la table personna.
Contenu :
id_film | id_realisateur | titre | genre | annee |
1 | 9 | Eyes Wide Shut | drame | 1999 |
2 | 11 | Mission impossible 5 | action | 2015 |
3 | 12 | Minority Report | SF | 2002 |
4 | 12 | Les dents de la mer | épouvante | 1975 |
5 | 12 | E.T. l'extraterrestre | SF | 1982 |
6 | 12 | Les aventuriers de l'Arche perdue | aventure | 1981 |
7 | 14 | Star Wars - Le Réveil de la Force | SF | 2015 |
8 | 2 | Bienvenue chez les Ch'tis | comédie | 2008 |
9 | 17 | La fille de D'Artagnan | cape et épée | 1994 |
10 | 18 | Un éléphant, ça trompe énormément | comédie | 1976 |
11 | 20 | Pédale dure | comédie | 2004 |
Question
Créer une liste de dictionnaires présentant : nom et prénom de l'acteur, film dans lequel il joue, date du film, rôle dans le film, réalisateur du film.
La liste sera triée en ordre croissant des noms des acteurs et pour un même acteur en ordre décroissant des titres de film.
Vous créerez enfin un fichier csv contenant le résultat.
Indice
Un relecture de la page cours vous permettra à coût sûr de réussir !
Solution
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)
personnes = de_csv_vers_dico('personna')
jeux = de_csv_vers_dico('joue')
films = de_csv_vers_dico('film')
liste = []
for acteur in personnes:
for joue in jeux:
if joue['id_acteur'] == acteur['id_personne']:
for film in films:
if joue['id_film'] == film['id_film']:
dico = {'nom': acteur['nom'],
'prenom': acteur['prenom'],
'film': film['titre'],
'annee': film['annee'],
'rôle': joue['role']
}
for realisateur in personnes:
if film['id_realisateur'] == realisateur['id_personne']:
dico['réalisateur'] = realisateur['nom']+' '+realisateur['prenom']
liste.append(dico)
# on trie:
liste.sort(key= lambda x:x['film'].lower(), reverse= True)
liste.sort(key= lambda x:x['nom'].lower())
de_dico_vers_csv(liste, 'rolesActeurs')