Pages : 1
#1 Le 07/03/2017, à 12:54
- Bob dit l'Âne
jeune python en panne [RESOLU]
Bonjour,
quelqu'un peut-il dépanner un apprenti ?
J'utilise en parallèle Geany et IDLE
Je vous fais passer mon script :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#======================================================================================================================
# API2.py
#===============================================================================================================================
# https://www.youtube.com/watch?v=CtLThUDOzhA - Tutoriel Python - Video n°10 - Analyse démographique- Auteur : Lucas Willems
#===============================================================================================================================
# FONCTION N° 1 qui ANALYSE le fichier .CSV et EXTRAIT les données
#...........................................................................................................................................
# Définition de la fonction
def extract_data(nom): # nom (extract_data) et paramètres (nom) de la fonction
fichier = open(nom) # pour ouvrir le fichier en mode lecture
contenu = fichier.read() # on lit tout le contenu du fichier.csv
fichier.close() # on ferme le fichier.csv
lignes = contenu.split('\n')[1:-1] # récupère dans la variable "lignes" le contenu du fichier.csv ([1:-1] pour la sélection des lignes)
# print(lignes) # pour affichage ou non du contenu du fichier
pays = {} # création du dictionnaire {pays} (clé : le nom des pays) - (valeur : un autre dictionnaire {années} qui contient les populations par année
for ligne in lignes: # pour itérer sur les lignes ou parcourir chaque ligne du fichier csv (pour extraire les données qu'on veut)
tout = ligne[:].split(',')
# print(tout) # pour affichage ou non des lignes
nom = tout[0] # "variable nom" pour écupérer le nom du pays (indice 0 - 1er élément de la liste)
# print(nom) # affichage ou non du nom du pays
valeurs = tout[2:6] # "variable valeurs" pour récupérer la valeur des populations par année ( indices 2 à 6 - du 3 ème au 5 ème élément de la liste)
# print(valeurs) # affichage ou non des valeurs
annees = {} # création du dictionnaire {années} - (clé : les années) - (valeurs : les populations par années)
i = 2012 # initialiser une "variable i" à 2012 (1ère année)
for valeur in valeurs: # itérer sur la "liste valeurs"
annees[i] = int(valeur) # récupération de la valeur de la variable i dans le dictionnaire années (int pour convertir la valeur en nombre)
i += 1 # incrémentation de la "variable i"
# print(annees) # affichage ou pas du dictionnaire {années}
pays[nom] = annees # (dictionnaire {pays} (clé : le nom des pays) - (valeur : un autre dictionnaire {années} qui contient les populations par année
return pays
#...........................................................................................................................................
# FONCTION N° 2 qui traite les données - qui trie les pays suivant leur progression démographique (rapport année de fin sur année de début), par ordre décroissant
#...........................................................................................................................................
# Définition de la fonction
def classement_progression(pays, debut, fin): # nom (classement_progression) et paramètres (pays, année de début, année de fin)de la fonction
classement = {} # création du dictionnaire "classement"
for nom, valeurs in pays.items(): # itérer sur le dictionnaire pays
classement[nom] = (valeurs[fin]/valeurs[debut]) #
classement = sorted(classement.items(), key=lambda x: x[1], reverse = True)
return classement
#...........................................................................................................................................#...........................................................................................................................................
# FONCTION N° 3 qui traite les données - qui trie les pays selon leur population pour une année donnée
#...........................................................................................................................................
# Définition de la fonction
def classement_population(pays, annee): # nom (classement_population) et paramètres (pays, annee)de la fonction
classement = {} # création du dictionnaire "classement"
for nom, valeurs in pays.items(): # itérer sur le dictionnaire pays
classement[nom] = valeurs[annee]
classement = sorted(classement.items(), key=lambda x: x[1], reverse = True)
return classement
#...........................................................................................................................................
# Appel de la fonction et récupération du résultat dans la variable "pays"
pays = extract_data("API.csv")
#print(pays) # affichage ou pas du dictionnaire {pays} (clé : le nom des pays) - (valeur : dictionnaire {années}
#...........................................................................................................................................
class1 = classement_progression(pays, 2012, 2015)
#class2 = classement_population(pays, 2015)
print(class1)
#print(class2)
#...........................................................................................................................................
# FONCTION N° 4 qui affiche les classements
#...........................................................................................................................................
# Définition de la fonction
#def affichage_classement(classement, nombre): # nom (affichage_classement) et paramètres (classement, nombre) de la fonction# (nombre - par exemple 3 - pour afficher les 3 premiers pays du classement)
# for i in range(nombre): # boucle POUR
# print(str(i+1) + ". " + classement[i][0] + " : " + str(classement[i][1])
#...........................................................................................................................................
#affichage_classement(class1, 3)
#...........................................................................................................................................
J'ai suivi ce tutoriel video
En fait, c'est la fonction n° 4 qui devrait afficher les classements ( fonctions 2 et 3) que je n'arrive pas à installer convenablement.
Voici la sortie du terminal :
File "API2.py", line 80
affichage_classement(class1, 3)
^
SyntaxError: invalid syntax
------------------
(program exited with code: 1)
Press return to continue
Une erreur de syntaxe à la ligne 80
Voici aussi mon fichier.csv (API.csv)
Nom pays,Code pays,2012,2013,2014,2015
Andorre,AND,79316,75902,72786,70473
Afghanistan,AFG,29726803,30682500,31627506,32526562
Angola,AGO,22685632,23448202,24227524,25021974
Albanie,ALB,2900247,2896652,2893654,2889167
Argentine,ARG,42095224,42538304,42980026,43416755
Arménie,ARM,2978339,2992192,3006154,3017712
Australie,AUS,22728254,23117353,23464086,23781169
Autriche,AUT,8429991,8479375,8541575,8611088
Belgique,BEL,11128246,11182817,11231213,11285721
Vous en remerciant par avance.
JYH
Dernière modification par Bob dit l'Âne (Le 08/03/2017, à 00:08)
DELL G3 17 3779 - 17,3" FHD IPS - Core i5 8300H - RAM 8Go - 1To DD +128Go SSD - NVIDIA GTX 1050 Ti 4 Go
Ubuntu 22.04.3 LTS Home séparé et partition données
Akoya MD 97860 P7612 Core 2 Duo T6500 NVIDIA Realtek RTL8191SE Wireless LAN GeForce G210M
Ubuntu 16.04 LTS (« Xenial Xerus ») + NFS
Hors ligne
#2 Le 07/03/2017, à 13:06
- pingouinux
Re : jeune python en panne [RESOLU]
Bonjour,
Il manque une parenthèse fermante à la fin de la ligne 78.
Remarque : Tu ne montres pas le script d'origine, car les lignes en question sont commentées
Hors ligne
#3 Le 07/03/2017, à 17:21
- Bob dit l'Âne
Re : jeune python en panne [RESOLU]
Super ! Merci pingouinux de m'avoir encore cette fois dépanné (je n'osais pas te solliciter une nouvelle fois)
Le coup de la parenthèse, j'aurais dû y penser. C'est quelquefois difficile de bien voir sur une vidéo, alors ...
Voici la sortie du terminal après correction :
[('Afghanistan', 1), ('Angola', 1), ('Australie', 1), ('Arm\xc3\xa9nie', 1), ('Belgique', 1), ('Autriche', 1), ('Argentine', 1), ('Albanie', 0), ('Andorre', 0)]
[('Argentine', 43416755), ('Afghanistan', 32526562), ('Angola', 25021974), ('Australie', 23781169), ('Belgique', 11285721), ('Autriche', 8611088), ('Arm\xc3\xa9nie', 3017712), ('Albanie', 2889167), ('Andorre', 70473)]
1. Afghanistan : 1
2. Angola : 1
3. Australie : 1
4. Arménie : 1
5. Belgique : 1
6. Autriche : 1
7. Argentine : 1
8. Albanie : 0
9. Andorre : 0
1. Argentine : 43416755
2. Afghanistan : 32526562
3. Angola : 25021974
4. Australie : 23781169
5. Belgique : 11285721
6. Autriche : 8611088
7. Arménie : 3017712
8. Albanie : 2889167
9. Andorre : 70473
------------------
(program exited with code: 0)
Press return to continue
Il y a encore une petite chose que je ne comprends pas:
résultat de la fonction 2 - tri des pays suivant leur progression démographique
Sortie du terminal avec Geany :
[('Afghanistan', 1), ('Angola', 1), ('Australie', 1), ('Arm\xc3\xa9nie', 1), ('Belgique', 1), ('Autriche', 1), ('Argentine', 1), ('Albanie', 0), ('Andorre', 0)]
Sortie du terminal avec IDLE :
[('Angola', 1.1029877413157367), ('Afghanistan', 1.0941829836191939), ('Australie', 1.0463262598174061), ('Argentine', 1.0313938464848174), ('Autriche', 1.0214824665886357), ('Belgique', 1.0141509272889906), ('Arménie', 1.0132197845846291), ('Albanie', 0.9961796357344737), ('Andorre', 0.8885092541227495)]
Comment faire pour avoir dans les 2 cas 1 nombre à virgule avec par exemple 4 décimales ?
DELL G3 17 3779 - 17,3" FHD IPS - Core i5 8300H - RAM 8Go - 1To DD +128Go SSD - NVIDIA GTX 1050 Ti 4 Go
Ubuntu 22.04.3 LTS Home séparé et partition données
Akoya MD 97860 P7612 Core 2 Duo T6500 NVIDIA Realtek RTL8191SE Wireless LAN GeForce G210M
Ubuntu 16.04 LTS (« Xenial Xerus ») + NFS
Hors ligne
#4 Le 07/03/2017, à 17:40
- pingouinux
Re : jeune python en panne [RESOLU]
Comment faire pour avoir dans les 2 cas 1 nombre à virgule avec par exemple 4 décimales ?
classement[nom] = (valeurs[fin]/valeurs[debut])
En pyhon2, la division de nombres entiers donne un entier (arrondi à la valeur inférieure). En python3, tu obtiens un float.
Tu peux faire ceci (il suffit de convertir le numérateur ou le dénominateur) :
classement[nom] = (float(valeurs[fin])/valeurs[debut])
et pour avoir 4 décimales :
classement[nom] = ("%.4f"%(float(valeurs[fin])/valeurs[debut]))
Hors ligne
#5 Le 07/03/2017, à 23:54
- Bob dit l'Âne
Re : jeune python en panne [RESOLU]
Merci pingouinux
Je viens de mettre à jour mon fichier.py
Ca marche impeccable.
Je vais donc marquer [RESOLU]
A plus donc
Dernière modification par Bob dit l'Âne (Le 08/03/2017, à 00:06)
DELL G3 17 3779 - 17,3" FHD IPS - Core i5 8300H - RAM 8Go - 1To DD +128Go SSD - NVIDIA GTX 1050 Ti 4 Go
Ubuntu 22.04.3 LTS Home séparé et partition données
Akoya MD 97860 P7612 Core 2 Duo T6500 NVIDIA Realtek RTL8191SE Wireless LAN GeForce G210M
Ubuntu 16.04 LTS (« Xenial Xerus ») + NFS
Hors ligne