Skip to content

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')