Maximum et fichier csv☘
Pour un jeu, on dispose d'un fichier csv nommé scores.csv dont le contenu est constitué des noms des joueurs et des scores obtenus à chaque partie.
1 2 3 4 5 6 7 8 9 10 11 12 13 | Antoine,203 Zozo,432 Martin,243 Antoine,542 Martin,625 Bertrand,105 Zozo,156 Bertrand,257 Cassien,125 Doris,1002 Zozo,234 Doris,800 Amandine,704 |
La mémoire étant de faible capacité sur l'appareil utilisé, de temps en temps on "purge" ce fichier. Cette purge consiste à ne garder que les lignes contenant le score maximal de chaque joueur.
Votre mission est donc de créer un script python qui:
- lit le fichier scores.csv
- repère les scores maxima pour chaque joueur.
- réécrit le fichier en n'inscrivant que les lignes qui contiennent le score maximal pour chaque joueur.
Lecture du fichier☘
Commencer par lire cette page de la documentation python. Puis écrire et tester une fonction de lecture du fichier.
Un code
On se contente ici d'une simple lecture pour comprendre le fonctionnement du module et le type de ce que l'on obtient en lecture:
1 2 3 4 5 6 7 | import csv with open('scores.csv', newline='') as f: lecteur = csv.reader(f, delimiter=',') for ligne in lecteur: print(ligne) |
On obtient l'affichage suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ['Antoine', '203'] ['Zozo', '432'] ['Martin', '243'] ['Antoine', '542'] ['Martin', '625'] ['Bertrand', '105'] ['Zozo', '156'] ['Bertrand', '257'] ['Cassien', '125'] ['Doris', '1002'] ['Zozo', '234'] ['Doris', '800'] ['Amandine', '704'] |
Détermination des max☘
Ecrire une fonction calculant un dictionnaire dicoMax
des scores maximaux.
Si Damien a pour score maximal 623, on devra avoir dicoMax['Damien'] = 623
.
Un code possible
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import csv def max_binaire(a, b): """ a et b sont de type int. La fonction renvoie le plus grand des deux. """ if a > b: return a else: return b def creation_dicoMax(fichier): dicoMax = {} with open(fichier, newline='') as f: lecteur = csv.reader(f, delimiter=',') for ligne in lecteur: nom, score = ligne[0], int(ligne[1]) if nom in dicoMax: # si ligne[0] est une clef du dictionnaire dicoMax[nom] = max_binaire(dicoMax[nom], score) else: dicoMax[nom] = score return dicoMax print(creation_dicoMax('scores.csv')) |
L'affichage obtenu:
1 2 3 | {'Antoine': 542, 'Zozo': 432, 'Martin': 625, 'Bertrand': 257, 'Cassien': 125, 'Doris': 1002, 'Amandine': 704} |
Réécriture du fichier des scores.☘
Réécrire le fichier des scores en ne réinscrivant que les scores maximaux pour chaque joueur.
Un code possible
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import csv def max_binaire(a, b): """ a et b sont de type int. La fonction renvoie le plus grand des deux. """ if a > b: return a else: return b def creation_dicoMax(fichier): dicoMax = {} with open(fichier, newline='') as f: lecteur = csv.reader(f, delimiter=',') for ligne in lecteur: nom, score = ligne[0], int(ligne[1]) if nom in dicoMax: # si ligne[0] est une clef du dictionnaire dicoMax[nom] = max_binaire(dicoMax[nom], score) else: dicoMax[nom] = score return dicoMax def reecriture_fichier(fichier): dicoMax = creation_dicoMax(fichier) with open(fichier, 'w', newline='') as f: ecrivain = csv.writer(f, delimiter=',') for nom, score in dicoMax.items(): ecrivain.writerow([nom, score ]) reecriture_fichier('scores.csv') |