Aller au contenu

Importation d'un pokédex⚓︎

Lecture d'un fichier CSV

Un pokédex est une liste de pokémons. Nous allons créer un pokédex avec la liste de tous les Pokemons de la première à la sixième génération. Cette liste est contenue dans le fichier pokemons.csv qu'il faut télécharger et placer dans le même dossier que votre fichier Python.

Nous pouvons utiliser le module csv pour importer ces données :

Exemples d'utilisation du module csv
>>> import csv  
>>> fichier = open("pokemons.csv", 'r', encoding='utf-8')
>>> pokedex = list(csv.DictReader(fichier, delimiter=','))
>>> fichier.close()
>>> pokedex[0]
OrderedDict([('Nom', 'Bulbizarre'), ('Type 1', 'Plante'), ('Type 2', 'Poison'),
             ('HP', '45'), ('Attaque', '49'), ('Défense', '49'), ('Vitesse', '45'),
             ('Génération', '1')])

On ouvre le fichier et ensuite, on utilise la commande csv.DictReader(fichier, delimiter=',') qui permet de lire un fichier CSV et renvoie une liste de dictionnaires correspondant à chaque ligne du tableau. Les descripteurs sont utilisés comme attributs des dictionnaires. On peut remarquer que dans le dictionnaire obtenu, il y n'y a pas le champs 'Types', mais au contraire deux champs différents. De même, toutes les valeurs numériques sont des textes. C'est là que l'étape de validation est importante.

Les dictionnaires renvoyés sont de type OrderedDict, qui à notre niveau, sont équivalents à des dictionnaires classiques. Ainsi les deux dictionnaires sont équivalents :

Version avec OrderedDict
OrderedDict([('Nom', 'Bulbizarre'), ('Type 1', 'Plante'), ('Type 2', 'Poison'),
             ('HP', '45'), ('Attaque', '49'), ('Défense', '49'), ('Vitesse', '45'),
             ('Génération', '1')])
Version avec dict
{'Nom': 'Bulbizarre', 'Type 1': 'Plante', 'Type 2': 'Poison', 
 'HP': '45', 'Attaque': '49', 'Défense': '49', 'Vitesse': '45', 
 'Génération': '1'}

Selon la version de Python, vous pouvez obtenir directement un dictionnaire classique.

Import du pokédex depuis le fichier csv

Afin d'importer le pokédex depuis pokemons.csv, nous utiliserons le code suivant :

Code à copier dans votre fichier
import csv

def validation(pokemon):
    for k in ["HP", "Attaque", "Défense", "Vitesse", "Génération"]:   
        pokemon[k] = int(pokemon[k])
    types = [pokemon["Type 1"]]
    if pokemon["Type 2"] != "":
        types.append(pokemon["Type 2"])
    pokemon["Types"] = types
    del pokemon["Type 1"]
    del pokemon["Type 2"]

def importation(nom_fichier):
    with open(nom_fichier, 'r', encoding='utf-8') as fichier:
        pokedex = []
        for pokemon in csv.DictReader(fichier, delimiter = ','):
            validation(pokemon)
            pokedex.append(pokemon)
    return pokedex

pokedex = importation("pokemons.csv")

Dans la fonction validation, les valeurs numériques sont converties en entiers et un nouvel attribut est ajouté à la place des deux attributs de types.

Vérification du contenu de pokedex
>>> pokedex[0]
OrderedDict([('Nom', 'Bulbizarre'), ('HP', 45), ('Attaque', 49), ('Défense', 49),
             ('Vitesse', 45), ('Génération', 1), ('Types', ['Plante', 'Poison'])])
Exemple de fonction manipulant le pokédex

Il est alors possible de faire des opérations sur le pokédex. Par exemple, la fonction suivante répond True si, et seulement si, le pokémon cherché se trouve dans le pokédex :

Code à copier dans votre fichier
def est_dans(nom_pokemon, pokedex):
    for p in pokedex:
        if nom(p) == nom_pokemon:
            return True
    return False
Exemples d'utilisation
>>> est_dans("Bulbizarre", pokedex)
True
>>> est_dans("Goldorak", pokedex) # Pas un pokémon
False
Exercice 4

Écrire une fonction cherche qui prend en paramètres un texte nom_pokemon et une liste de dictionnaires pokedex, et qui renvoit le dictionnaire correspondant au pokémon demandé, s'il est dans le pokédex et None sinon.

Exemples d'utilisation
>>> cherche("Bulbizarre", pokedex)
OrderedDict([('Nom', 'Bulbizarre'), ('HP', 45), ('Attaque', 49), ('Défense', 49),
             ('Vitesse', 45), ('Génération', 1), ('Types', ['Plante', 'Poison'])])
>>> cherche("Goldorak", pokedex) # None ne s'affiche pas
>>>