Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de dé-serialization

Sujet résolu
Anonyme
    16 novembre 2017 à 15:38:56

    Bonjour, j'ai un petit contre temps que je tarde à comprendre, j'ai un petit script qui récupère des infos en ligne, puis les mets dans un objet (plus facile à recuperer que du texte brut) pour les enregistrer en attendant d'avoir vu les bases de données.

    Seulement si j'y arrive bien (à le recuperer) dans le même fichier j'ai un message d'erreur comme quoi je ne peux pas acceder aux attributs de mon objet, que ce soit avec un script ou via le terminal

    #!/usr/bin/python3.6
    # -*-coding:Latin-1 -*
    
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import time, pickle
    
    t = time.localtime()
    nom_g = "./data_wina/" + str(t.tm_year) + "-" + str(t.tm_mon) + "_" + str(t.tm_mday)
    nom_basses = nom_g + "-basses"
    nom_micros = nom_g + "-micros"
    
    url_basses = "https://www.monurl.com"
    url_micros = "https://www.monsite.fr"
    
    class MaTable:
        def __init__(self):
            self.place = []
            self.pseudo = []
            self.nb_mains = []
            self.nb_caves = []
        def ajout(self, place, pseudo, nb_mains, nb_caves):
            index = len(self.place)
            self.place.append(place)
            self.pseudo.append(pseudo)
            self.nb_mains.append(nb_mains)
            self.nb_caves.append(nb_caves)
        def getPlace(self, index):
            return self.place[index]
        def getPseudo(self, index):
            return self.pseudo[index]
        def getNbMains(self, index):
            return self.nb_mains[index]
        def getNbCaves(self, index):
            return self.nb_caves[index]
        def getNB(self):
            return len(self.place)
    
    table_micros = MaTable()
    try :
        html_micros = urlopen(url_micros)
        #html_basses = urlopen(url_basses)
    except HTTPError as e:
        print(e)
    try:
        bs_m = BeautifulSoup(html_micros.read(), "html.parser")
        #bs_b = BeautifulSoup(html_basses.read(), "html.parser")
        micros = bs_m("tr", recursive=True)
       # basses = bs_b("tr", recursive=True)
        micros_str= ""
        
        table_micros = MaTable()
        c = 0
        for l in micros :
            print(c)
            if not c == 0 and not 101 == c:
                if c < 21:
                    mains = int(l.findAll()[4].get_text().replace(" ",""))
                    caves = float(l.findAll()[6].get_text().replace(',', '.'))
                    print(l.findAll()[0].get_text() + l.findAll()[2].get_text() + str(mains) + str(caves))
                    table_micros.ajout(int(l.findAll()[0].get_text()),l.findAll()[2].get_text(),mains,caves)
                else:
                    mains = int(l.findAll()[2].get_text().replace(" ",""))
                    caves = float(l.findAll()[3].get_text().replace(',', '.'))
                    print(l.findAll()[0].get_text() + l.findAll()[1].get_text() + str(mains) + str(caves))
                    table_micros.ajout(int(l.findAll()[0].get_text()), l.findAll()[1].get_text(), mains,caves)
            c += 1 
    
        table_basses = MaTable()
    
        with open(nom_micros, 'wb') as fichier:
            mon_pickler = pickle.Pickler(fichier)
            mon_pickler.dump(table_micros)
        with open(nom_micros, 'rb') as fichier:
            d = pickle.Unpickler(fichier)
            t = d.load()
            print(t.getPseudo(2)) # ICI TOUT VA BIEN JE RECUPERE MON OBJET SANS SOUCIS
            
    except AttributeError as e:
        print(e)
    
    
    

    resultat à la console :

    >>> from bs4 import BeautifulSoup
    >>> import pickle
    >>> with open ("2017-11_16-micros", "rb") as fichier:
    ...     d = pickle.Unpickler(fichier)
    ...     m = d.load()
    ...     print(m.getPseudo(2))
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 3, in <module>
    AttributeError: Can't get attribute 'MaTable' on <module '__main__' (built-in)>
    >>> 
    

    et je ne comprends vraiment pas pourquoi dans un cas je le recupère et dans l'autre non..

    Merci à vous ;)


    -
    Edité par Anonyme 16 novembre 2017 à 15:40:53

    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2017 à 17:13:26

      Salut, ton second script n'a aucune idée de comment est organisé ton objet et ne peut ainsi pas le reconstruire. Pour cela il faudrait que tu importes MaTable de ton premier fichier dans ton second. Par ailleurs , autant faire quelque chose de propre dès le début (tu auras toujours besoin de l'importer dans ton second fichier, mais ce sera plus clair) :

      import pickle
      
      class Test() :
      
          def __init__(self, value) :
              self.value = value
      
          def save(self, outfile) :
              with open(outfile, "wb") as f :
                  pick = pickle.Pickler(f)
                  pick.dump(self)
      
          @staticmethod
          def load(fname) :
              with open(fname, 'rb') as f :
                  pick = pickle.Unpickler(f)
                  return pick.load()
      
      t = Test(1)
      t.save("./test.pickle")
      s = Test.load('./test.pickle')
      print (s.value)



      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        16 novembre 2017 à 20:16:35

        hum bon sang mais c'est bien sur !

        Merci et pour l'utilisation de la methode statique je regarde de suite.

        Merci

        -
        Edité par Anonyme 16 novembre 2017 à 20:20:52

        • Partager sur Facebook
        • Partager sur Twitter

        probleme de dé-serialization

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown