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 :
>>> 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 :
OrderedDict([('Nom', 'Bulbizarre'), ('Type 1', 'Plante'), ('Type 2', 'Poison'),
('HP', '45'), ('Attaque', '49'), ('Défense', '49'), ('Vitesse', '45'),
('Génération', '1')])
{'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 :
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.
>>> 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 :
def est_dans(nom_pokemon, pokedex):
for p in pokedex:
if nom(p) == nom_pokemon:
return True
return False
>>> 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.
>>> 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
>>>