Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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