Menu

Problème ajout d'un objet dans une liste Python [Résolu]

Messages postés
5
Date d'inscription
vendredi 21 décembre 2018
Dernière intervention
25 décembre 2018
-
Bonjour,

Je souhaite créer une liste qui reprendrait tous les films (repris d'un fichier CSV), sachant que chaque film est un objet Movie.
Mais, lorsque j'ajoute un objet à la liste, il ajoute bien cet objet mais il écrase aussi automatiquement tous les objets de la liste et les remplace par l'objet qu'on voulait ajouter.

Voilà la classe :

class Movie:



    # -------------------------------------------------------------------------

    movie_id: int

    movie_imdb: int

    name: str

    actors: List[Actor]

    summary: str

    category: List[str]



    # -------------------------------------------------------------------------

    def __init__(self, movie_id: int, name: str, category: []):

        self.movie_id = movie_id

        self.movie_imdb = 0

        self.name = name

        self.actors = []

        self.summary = ""

        self.category = category

    # -------------------------------------------------------------------------

    def imprimer(self):

        print(movie_id)

        print(name)

        print(category)


Code pour stocker les films dans la liste :
f = open ('test_movies.csv')
fichier_test = csv.reader(f)
category = []
tous_les_films = []#Liste qui contiendra l'ensemble des films provenant du fichier movies.csv
movieId = 0
for ligne in fichier_test:
    category.clear()
    movie_id = ligne[0]
    name = ligne[1]
    category_ligne = ligne[2]
    for mot in category_ligne.split("|"):
        category.append(mot)
    film = Movie(movie_id, name, category)
    tous_les_films.append(film) 
for i in tous_les_films:
    i.imprimer()
Output:
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']


Contenu fichier Csv:

1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
2,Jumanji (1995),Adventure|Children|Fantasy
3,Grumpier Old Men (1995),Comedy|Romance
4,Waiting to Exhale (1995),Comedy|Drama|Romance
5,Father of the Bride Part II (1995),Comedy


Merci d'avance pour votre aide :)
Afficher la suite 

Votre réponse

3 réponses

Messages postés
3320
Date d'inscription
jeudi 16 juin 2005
Dernière intervention
19 février 2019
1171
0
Merci
Bonjour,

Du python sans indentation, c'est absolument illisible.
Pourriez-vous utiliser la balise < code>, avec le langage idoine (bouton <> dans l'interface de saisie du message), qui permet de conserver la mise en forme et rajoute de la coloration syntaxique ?

Xavier
gdepotter
Messages postés
5
Date d'inscription
vendredi 21 décembre 2018
Dernière intervention
25 décembre 2018
-
Classe Movie:

class Movie: 



# ------------------------------------------------------------------------- 

movie_id: int 

movie_imdb: int 

name: str 

actors: List[Actor] 

summary: str 

category: List[str] 



# ------------------------------------------------------------------------- 

def __init__(self, movie_id: int, name: str, category: []): 

self.movie_id = movie_id 

self.movie_imdb = 0 

self.name = name 

self.actors = [] 

self.summary = "" 

self.category = category 

# ------------------------------------------------------------------------- 

def imprimer(self): 

print(movie_id) 

print(name) 

print(category) 


Code pour ajouter l'objet dans la liste:

f = open ('test_movies.csv')
fichier_test = csv.reader(f)
category = []
tous_les_films = []#Liste qui contiendra l'ensemble des films provenant du fichier movies.csv
movieId = 0
for ligne in fichier_test:
    category.clear()
    movie_id = ligne[0]
    name = ligne[1]
    category_ligne = ligne[2]
    
    for mot in category_ligne.split("|"):
        category.append(mot)
        
    film = Movie(movie_id, name, category)
    tous_les_films.append(film) 

for i in tous_les_films:
    i.imprimer()
Commenter la réponse de Reivax962
Messages postés
763
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 février 2019
52
0
Merci
def imprimer(self): 
   print(self.movie_id) 
   print(self.name) 
   print(self.category) 


Essaye avec ce code
Jithel
Messages postés
763
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 février 2019
52 -
Il doit y avoir un problème ici :
for mot in category_ligne.split("|"):
        print(mot)
        category.append(mot)


Vérifie que le print(mot) affiche bien toutes les catégories et non Comedy à chaque fois
gdepotter
Messages postés
5
Date d'inscription
vendredi 21 décembre 2018
Dernière intervention
25 décembre 2018
-
Oui il les affiche bien. Ca ne vient pas de là.
Jithel
Messages postés
763
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 février 2019
52 -
J'ai comme l'impression qu'il manque un
self.category
quelque part dans le code de ta classe. Tu es sûr que tu as mis ce code :
def imprimer(self): 
   print(self.movie_id) 
   print(self.name) 
   print(self.category) 
Reivax962
Messages postés
3320
Date d'inscription
jeudi 16 juin 2005
Dernière intervention
19 février 2019
1171 -
Bonjour,

Je ne connais pas bien Python, mais il me semble que le tableau category est toujours le même, réutilisé pour chaque objet. Le category.Clear() ne réinstancie pas un nouveau tableau. Du coup chaque objet fait en fait référence au même tableau Category, qui est vidé et rempli à chaque fois. Ne reste donc à la fin que son dernier contenu.

À mon avis, il faudrait soit remplacer category.Clear() par le code pour instancier un nouveau tableau, soit modifier le __init__ de Movie pour faire une copie de category dans un nouveau tableau, plutôt que de référencer le tableau courant.

Xavier
Jithel
Messages postés
763
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 février 2019
52 > Reivax962
Messages postés
3320
Date d'inscription
jeudi 16 juin 2005
Dernière intervention
19 février 2019
-
Je confirme le comportement que tu as imaginé. C'est bien comme cela que ça se passe sous Python, je viens de le vérifier. Dans ce cas, effectivement, il faut remplacer .clear() par
 category = []
.
Commenter la réponse de Jithel
Messages postés
5
Date d'inscription
vendredi 21 décembre 2018
Dernière intervention
25 décembre 2018
0
Merci
Merci beaucoup à tous. Mon problème est résolu grâce à vous ! :)
Commenter la réponse de gdepotter