====== 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 ?