Problème ajout d'un objet dans une liste Python

Résolu
gdepotter Messages postés 5 Statut Membre -  
gdepotter Messages postés 5 Statut Membre -
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 :)

3 réponses

  1. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
    0
    1. gdepotter Messages postés 5 Statut Membre
       
      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()
      0
  2. Jithel Messages postés 1049 Statut Membre 171
     
    def imprimer(self): 
       print(self.movie_id) 
       print(self.name) 
       print(self.category) 
    


    Essaye avec ce code
    0
    1. gdepotter Messages postés 5 Statut Membre
       
      Merci beaucoup, ça a déjà résolu un de mes problèmes! Mais les catégories s'affichent toujours mal. Avez-vous une idée?

      Ce que la console affiche :

      1
      Toy Story (1995)
      ['Comedy']
      2
      Jumanji (1995)
      ['Comedy']
      3
      Grumpier Old Men (1995)
      ['Comedy']
      4
      Waiting to Exhale (1995)
      ['Comedy']
      5
      Father of the Bride Part II (1995)
      ['Comedy']

      Ce qu'elle devrait afficher :

      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']
      0
    2. Jithel Messages postés 1049 Statut Membre 171
       
      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
      0
    3. gdepotter Messages postés 5 Statut Membre
       
      Oui il les affiche bien. Ca ne vient pas de là.
      0
    4. Jithel Messages postés 1049 Statut Membre 171
       
      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) 
      
      0
    5. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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
      0
  3. gdepotter Messages postés 5 Statut Membre
     
    Merci beaucoup à tous. Mon problème est résolu grâce à vous ! :)
    0