IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Python 2.x]EOFError et problème de serialisation


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Points : 31
    Points
    31
    Par défaut [Python 2.x]EOFError et problème de serialisation
    Bonjour,

    J'ai un problème que je n'arrive pas à identifier. Mon but avec ce code est d'ouvrir un fichier *.pkl et d'écrire dedans. Cela est simple mais une fois l'exécution terminée il n'y a plus aucune trace de l'entrée ajoutée dans le fichier *.pkl.

    Le code est réparti sur 2 fichiers : Stock.py contenant les fonctions pour serialiser/déserialiser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    # Stock.py
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import pickle
     
    def deserialize(fich):    
        pkl_file = open(fich, 'rb')
        requetes = pickle.load(pkl_file)
        pkl_file.close()
        return requetes
     
    def serialize(fich, data):
        output = open(fich, 'wb')
        pickle.dump(data, output)
        print"serialise is okay !"
        output.close()
    Un fichier inter2.py, utilisant Stock.py, et ajoutant une entrée au fichier *.pkl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #inter2.py
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # (...)
     
    requetes = Stock.deserialize('requetes.pkl')
     
    def Seriz_Rq(Nam_Rq):
    print requetes.keys()
    	if Nam_Rq not in requetes.keys() :
    		print "Michel is alive"
    		requetes[Nam_Rq] = Rq.get("1.0", END)
    		Stock.serialize('requetes.pkl', requetes)
    		print requetes
    	else :
    		showerror("Alerte","Nom de requête déjà utilisé")
     
     
    def Fn_Nam_Rq():
     
    	def Get_Nam_Rq():
    		Nam_Rq=Entry_Nam_Rq.get()
    		Fn_Entry.destroy()
    		Seriz_Rq(Nam_Rq)
     
    	Fn_Entry = Toplevel()
    	label_Nam_Rq = Label(Fn_Entry, text='Entrez le nom de la requete')
    	label_Nam_Rq.grid(row=0,column=0)
    	Entry_Nam_Rq = Entry(Fn_Entry,width=20)
    	Entry_Nam_Rq.grid(row=1,column=0)
    	Entry_Nam_Rq.bind("<Return>", Get_Nam_Rq)
    	Butt_Valid_Nam=Button(Fn_Entry, text='Ok',relief=GROOVE, command=Get_Nam_Rq)
    	Butt_Valid_Nam.grid(row=1,column=1)
     
    def Click_Rq_Save():
    	if len(Rq.get("1.0", END)) != 1:
    		Fn_Nam_Rq()
    	else:
    	  	Label_Error_Txt.set("Requête non-enregistrée : Champs requête vide")
     
    # (...)
    Ces fonctions sont intégrées au sein d'une interface : la fonction Click_Rq_Save() est utiliser quand on clic pour sauvegarder la session donc. Ce qui entraine l'ouverture d'une nouvelle fenêtre avec un champ Entry. Ce champs avec être utiliser pour donner un nom à une nouvelle entrée dans le dictionnaire "requetes" (nom de variable utilisée lors de l'ouverture du fichier du même). Il s'en suit, par l'intermédiaire de la foncton Seriz la vérification de doublon dans les noms de clés du dictionnaire requetes et ensuite, si cela est possible, l'inscription de la nouvelle entrée dans le dictionnaire.

    Tout ceci fonctionne tant le programme tourne, la vérification des noms des clés, l'inscription dans le dictionnaire, mais dès que le programme est arrêté alors le dictionnaire redevient comme à l'origine (nous avions déjà créé quelques entrées auparavant).

    De plus, par moment une erreur 'EOFError' apparaît et ce de manière aléatoire sans avoir touché au code.

    Je n'arrive pas trop à identifier la source du problème et comment le résoudre.

    Cordialement,

    Unic0

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Bonsoir, je n'ai toujours pas trouvé LA réponse à ce problème mais j'ai trouvé un palliatif.

    Plutôt que d'utiliser un fichier *.pkl et la sérialisation binaire du module pickle, il est possible d'utiliser un fichier-dictionnaire avec le module anydbm. (source)

    Du coup le code se passe de module complémentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    db_Rq = anydbm.open('Requetes.dbm', 'c')
     
    def Seriz_Rq(Nam_Rq):
        print db_Rq.keys()
        if Nam_Rq in db_Rq.keys():
            showerror("Alerte", "Nom de requête déjà utilisé")
        else:
            db_Rq[Nam_Rq] = Rq.get("1.0", END).encode('utf8', 'replace')
            print db_Rq
     
     
    def Fn_Nam_Rq():
     
        def Get_Nam_Rq():
            Nam_Rq = Entry_Nam_Rq.get()
            Fn_Entry.destroy()
            Seriz_Rq(Nam_Rq)
     
        Fn_Entry = Toplevel()
        label_Nam_Rq = Label(Fn_Entry, text='Entrez le nom de la requete')
        label_Nam_Rq.grid(row=0, column=0)
        Entry_Nam_Rq = Entry(Fn_Entry, width=20)
        Entry_Nam_Rq.grid(row=1, column=0)
        Entry_Nam_Rq.bind("<Return>", Get_Nam_Rq)
        Butt_Valid_Nam = Button(
            Fn_Entry, text='Ok', relief=GROOVE, command=Get_Nam_Rq)
        Butt_Valid_Nam.grid(row=1, column=1)
     
     
    def Click_Rq_Save():
        if len(Rq.get("1.0", END)) != 1:
            Fn_Nam_Rq()
        else:
            Label_Error_Txt.set("Requête non-enregistrée : Champs requête vide")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTree] Problème de Serialisation / Deserialisation
    Par jojodu31 dans le forum Composants
    Réponses: 6
    Dernier message: 21/07/2009, 10h35
  2. Problème de serialisation/deserialisation
    Par NoiBe dans le forum Services Web
    Réponses: 0
    Dernier message: 18/03/2009, 18h40
  3. Problème xstream serialisation
    Par PESkiller dans le forum Documents
    Réponses: 0
    Dernier message: 05/12/2008, 12h49
  4. Petit problème de serialisation
    Par Julien_C++ dans le forum C++/CLI
    Réponses: 8
    Dernier message: 22/01/2008, 19h59
  5. problème de serialisation
    Par volivi dans le forum Services Web
    Réponses: 2
    Dernier message: 19/10/2007, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo