====== Bases de données - Exercice préparatoire ======
Fichiers utiles : {{ nsi:premiere:csv:films.csv |}} et {{ nsi:premiere:csv:actors.csv |}}
===== Exercice 1 : extraire et rechercher des données =====
Écrire un programme Python qui implémente les fonctions suivantes :
# data.py
import csv
def creer_base_films():
"""
extrait le contenu du fichier films.csv
renvoie les données sous forme d'un tableau de dictionnaires
"""
films = []
with open("films.csv", "r", encoding="utf8") as file:
reader = csv.DictReader(file, delimiter = ";")
for row in reader:
film = dict(row)
films.append(film)
return films
def recherche_realisateur(base, nom):
"""
base: données extraites du fichier films
nom: nom du réalisateur cherché
renvoie les titres de films dont réalisés par ce réalisateur
"""
def recherche_annees_acteur(base, nom):
"""
base: données extraites du fichier films
nom: nom de l'acteur cherché
renvoie les années des films dans lesquels joue l'acteur demandé
"""
def count_pays(base, pays):
"""
base: données extraites du fichier films
pays: code d'un pays (exemple FRA pour France)
renvoie le nombre de films pour un pays
Attention: Dans la colonne pays du fichier,
il y a souvent plusieurs pays pour un film, comme FRA - ITA
"""
if __name__ == "__main__":
# zone de test
base = creer_base_films()
films_mel_brooks = recherche_realisateur(base, "BROOKS Mel")
print(films_mel_brooks)
annees_bulle_ogier = recherche_annees_acteur(base, "Bulle Ogier")
print(annees_bulle_ogier)
n_FRA = count_pays(base, "FRA")
print(n_FRA)
Je vous rappelle que ''csv.DictReader'' peut être vu comme une machine qui se charge
* d'extraire la première ligne du fichier pour obtenir les noms des colonnes,
* d'extraire chaque ligne en la distribuant dans un dictionnaire dont les clés sont les noms des colonnes.
La commande ''for row in reader'' (ligne 13) consiste à demander à ''reader'' d'extraire la prochaine ligne. Quand il n'y a plus de lignes à extraire, ''reader'' ne renvoie rien et la boucle prend fin.
À noter que la donnée ''row'' fournie par ''reader'' est proche d'un dictionnaire mais n'en est pas tout à fait un. Donc on transforme ''row'' en un dictionnaire : ''dict(row)''.
===== Exercice 2 : Fusionner des données =====
On dispose d'un autre fichier, {{ nsi:premiere:csv:actors.csv |}}, répertoriant les années de naissance -- pas les vraies -- des acteurs et actrices.
Comment peut-on obtenir le titre de tous les films dans lequel a joué un acteur né en 1977 ?
> Je ne vous demande pas de le coder, expliquez seulement ce qu'il faudrait faire.
===== Exercice 3 : Cohérence des données =====
Supposons que l'on fasse des ajouts, suppressions ou modifications dans les fichiers ''films.csv'' et ''actors.csv''.
* Y a-t-il des contraintes particulières à respecter ?
* Supposons que deux acteurs aient le même nom. Que faire ?