Aller au contenu

Une fonction python qui renvoie la recette totale générée par des films.


rm57Sp

Messages recommandés

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

Bonsoir, j'ai un devoir maison à rendre pour vendredi, j'ai déjà fini la partie SQL et voilà que je m'attaque à la partie Python

Mais il y a un problème je ne comprend pas comment une fonction python qui renvoie la recette totale générée par des films.

Est-ce qu'il faut s'y prendre de la même manière qu'avec le SQL (c'est-à-dire en utilisant des termes comme SELECT FROM etc...) 

Ou alors d'une tout autre manière

Merci d'avance

Voilà un extrait du sujet:

 

On dispose d’un fichier films.csv contenant des informations sur plus de 1000 films. Le délimiteur est le point-virgule. Chaque ligne de ce fichier contient les 5 informations suivantes :

• l’identifiant du film,

• le titre original du film,

• l’année de sortie du film,

• sa durée en minutes,

• la recette qu’il a générée, exprimée en dollars.

Voici à quoi ressemblent les deux premières lignes de ce fichier :

8193;Napoleon Dynamite;2004;95;46118097 8195;Ronin;1998;122;41610884

Pour rappel, voici le code permettant d’importer un fichier csv situé dans le même dossier que votre fichier python et de le stocker dans un tableau appelé liste_films.

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
 liste_films.append(ligne)

 1. Ecrire une fonction qui renvoie la recette totale générée par tous ces films.

Lien à poster
Partager sur d’autres sites

Annonces
Maintenant
Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)

@rm57Sp

après l'import du fichier csv t'as liste_films qui contient des listes de tous les informations sur chaque film.

Pour la ligne que t'as donné en exemple t'auras la liste suivante :

[' 8193', 'Napoleon Dynamite', '2004', '95', '46118097 8195', 'Ronin', '1998', '122', '41610884 ']

Si la recette est le dernier élément :

film = [' 8193', 'Napoleon Dynamite', '2004', '95', '46118097 8195', 'Ronin', '1998', '122', '41610884']
rectte = int(film[-1]) # int pour convertir le montant en integer

>>> recette
41610884

Maintenant nous allons créer une liste qui ne contient que les recettes de tous les films :

all = [int(i[-1]) for i in liste_films]

Puis faire la somme de la liste avec la méthode sum :

somme_recettes = sum(all)

 

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

@korvo

J'ai essayer de coder ce que tu m'as expliquer mais je n'ai pas réussi

Donc j'ai créer une boucle for et que j'ajoute la partie de la recette

Mais bon j'ai toujours pas réussi...

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    for i in range(1,len(liste_films)
    rep=liste[]+rep
        return rep

 

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
il y a 15 minutes, rm57Sp a dit :

@korvo

J'ai essayer de coder ce que tu m'as expliquer mais je n'ai pas réussi

Donc j'ai créer une boucle for et que j'ajoute la partie de la recette

Mais bon j'ai toujours pas réussi...

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    for i in range(1,len(liste_films)
    rep=liste[]+rep
        return rep

 

C'est normal que ta fonction ne marche pas, par contre la solution que je t'ai donné devrait marcher, sauf s'il y a une erreur dans le fichier csv. dans ce cas remplace

all = [int(i[-1]) for i in liste_films]

par :

all = [int(i[-1].strip()) for i in liste_films] # ".strip()" élimine les espaces au début et à la fin d'un string

Quel est le message d'erreur que t'envoie la console python?

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

Comment je dois faire?

Comme ça ?

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    all = [int(i[-1].strip()) for i in liste_films]
    somme_recettes = sum(all)


Si c'est cela dans la console lorsque je met recette()

ça me renvoi ça

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Yass\Desktop\NSI\Python\DM\DM2 ABR.py", line 22, in recette
    all = [int(i[-1].strip()) for i in liste_films]
  File "C:\Users\Yass\Desktop\NSI\Python\DM\DM2 ABR.py", line 22, in <listcomp>
    all = [int(i[-1].strip()) for i in liste_films]
ValueError: invalid literal for int() with base 10: 'recette'

 

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
il y a 55 minutes, rm57Sp a dit :

Comment je dois faire?

Comme ça ?

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    all = [int(i[-1].strip()) for i in liste_films]
    somme_recettes = sum(all)


Si c'est cela dans la console lorsque je met recette()

ça me renvoi ça

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Yass\Desktop\NSI\Python\DM\DM2 ABR.py", line 22, in recette
    all = [int(i[-1].strip()) for i in liste_films]
  File "C:\Users\Yass\Desktop\NSI\Python\DM\DM2 ABR.py", line 22, in <listcomp>
    all = [int(i[-1].strip()) for i in liste_films]
ValueError: invalid literal for int() with base 10: 'recette'

 

La function recette() doit retourner la somme, donc remplace la ligne somme_recettes = sum(all) par return sum(all)

Mais c'est pas ça le problème, le problème vient d'une entrée dans le fichier csv que python n'a pas réussi à convertir en int.

Teste ce code et dis moi ce que ça retourne :

for i in liste_films :
	try :
		assert i[-1].strip().isdigit()
	except :
		print(f"Le problème vient de l'entrée {i[-1]} dans la line {liste_films.index(i)} du fichier csv") 

 

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

@korvo

ça me renvoi ça

recette()
Le problème vient de l'entrée recette dans la line 0 du fichier csv

 

Si j'ai coder comme ça

 

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    for i in liste_films :
        try :
            assert i[-1].strip().isdigit()
        except :
                print(f"Le problème vient de l'entrée {i[-1]} dans la line {liste_films.index(i)} du fichier csv")

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
il y a 1 minute, rm57Sp a dit :

@korvo

ça me renvoi ça

recette()
Le problème vient de l'entrée recette dans la line 0 du fichier csv

 

Si j'ai coder comme ça

 

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    for i in liste_films :
        try :
            assert i[-1].strip().isdigit()
        except :
                print(f"Le problème vient de l'entrée {i[-1]} dans la line {liste_films.index(i)} du fichier csv")

:D ça veut dire que le fichier csv commence par un titre, dans la première ligne on trouve le mot "recette"

lance le même code en remplaçant for i in liste_films : par for i in liste_films[1:] :

pour voir s'il y a d'autres erreurs.

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

@korvo

ça me renvoi ça

recette()
Le problème vient de l'entrée recette dans la line 0 du fichier csv

 

Si j'ai coder comme ça

 

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    for i in liste_films :
        try :
            assert i[-1].strip().isdigit()
        except :
                print(f"Le problème vient de l'entrée {i[-1]} dans la line {liste_films.index(i)} du fichier csv")

@korvo

Cette fois lorsque je met dans la console

recette()

 

Ca ne me renvoi rien

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)

@rm57Sp je t'ai demandé de remplacer liste_films par liste_films[1:] dans la première ligne de la fonction recette.

Il faut que tu comprennes ce que t'est en train de faire, c'est très important.

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

@korvo

Oui oui je comprend bah c'est ce que j'ai fait mais ça me renvoi rien cette fois ci

 

J'ai fait ça

import csv
liste_films=[]
with open("films_test2.csv",'r',encoding='utf-8') as f:
 lecteur=csv.reader(f,delimiter=';')
 for ligne in lecteur:
    liste_films.append(ligne)

def recette():
    for i in liste_films[1:]:
        try :
            assert i[-1].strip().isdigit()
        except :
                print(f"Le problème vient de l'entrée {i[-1]} dans la line {liste_films.index(i)} du fichier csv")
 

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
il y a 6 minutes, rm57Sp a dit :

@korvo

Oui oui je comprend bah c'est ce que j'ai fait mais ça me renvoi rien cette fois ci

 

Si ça te renvoie rien ça veut dire que tout est ok,  tu peux revenir maintenant à la version précédente et n'oublie pas, la fonction doit retourner la somme (return sum(all)), et la liste liste_films tu dois la parcourir à partir de l'élément 1 ( liste_films[1:])

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

@korvo

Donc si j'ai bien compris il faut que je fasse:

def recette():
    for i in liste_films[1:] :
        all = [int(i[-1]) for i in liste_films]
        return sum(all)

Si c'est pas ça peu tu m'écrire le code pour que je comprenne mieux (je suis débutant en python c'est pour ça que je suis encore un peu nul...)

 

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
il y a 50 minutes, rm57Sp a dit :

@korvo

Donc si j'ai bien compris il faut que je fasse:

def recette():
    for i in liste_films[1:] :
        all = [int(i[-1].strip()) for i in liste_films]
        return sum(all)

Si c'est pas ça peu tu m'écrire le code pour que je comprenne mieux (je suis débutant en python c'est pour ça que je suis encore un peu nul...)

 

Oui c'est exactement ça, il faut juste ajouter .strip() en cas ou s'il y a un espace au début ou à la fin du montant.

 

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)
File "<module3>", line 3
    for i in liste_films[1:] :
    ^
SyntaxError: invalid character in identifier

Ca me renvoi ça maintenant, il doit manquer quelque chose à mon avis 

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
il y a une heure, rm57Sp a dit :
File "<module3>", line 3
    for i in liste_films[1:] :
    ^
SyntaxError: invalid character in identifier

Ca me renvoi ça maintenant, il doit manquer quelque chose à mon avis 

Une erreur de syntaxe dans la ligne précédente, sans doute, vérifie bien.

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Yacine\Desktop\NSI\Python\DM\DM2 ABR.py", line 23, in recette
    all = [int(i[-1].strip()) for i in liste_films]
  File "C:\Users\Yacine\Desktop\NSI\Python\DM\DM2 ABR.py", line 23, in <listcomp>
    all = [int(i[-1].strip()) for i in liste_films]
ValueError: invalid literal for int() with base 10: 'recette'
    
    Je pas compris ce que ça veut dire cette erreur

 

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

@korvo Il y a toujours ce petit bug 

Lien à poster
Partager sur d’autres sites

Invité korvo
Invités, Posté(e)
Invité korvo
Invité korvo Invités 0 message
Posté(e)
Il y a 2 heures, rm57Sp a dit :

@korvo Il y a toujours ce petit bug 

Mais c'est normal, on a dit que la première ligne du fichier et donc le premier élément de ta liste c'est le titre "recette", comment python peut-il convertir le mot "recette" en int?, et on a corrigé, on a remplacé liste_films par liste_films[1:], pourquoi tu répètes toujours la même erreur :hu:.

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

Oui désolé c'est bon ça marche c'est juste que j'avais mal placé le liste_films[1:

Lien à poster
Partager sur d’autres sites

Annonces
Maintenant

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×