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 :

Erreur avec pickle


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut Erreur avec pickle
    Bonjour à tous,
    J'apprend Python avec le cours de Gérard Swinnen (excellent !...).
    J'en suis au chapitre 9.9 : utilisation de pickle.
    Mon script ne fonctionnant pas, j'ai fait un copier-coller des exemples du cours (ci-dessous) et ça ne marche pas non plus, les variables a,b,c, ne sont apparemment pas reconnues.
    Une idée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    a = 5
    b = 2.83
    c = 67
    f = open('Monfichier', 'w')
    f.write(str(a))
    f.write(str(b))
    f.write(str(c))
    f.close()
    f = open('Monfichier', 'r')
    print f.read()
    f.close()
    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
     
    import pickle
    f = open('Monfichier', 'w')
    pickle.dump(a, f)
    pickle.dump(b, f)
    pickle.dump(c, f)
    f.close()
    f = open('Monfichier', 'r')
    t = pickle.load(f)
    print t, type(t)
    t = pickle.load(f)
    print t, type(t)
    t = pickle.load(f)
    print t, type(t)
    f.close()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
    52.8367
    >>> ================================ RESTART ================================
    >>> 
     
    Traceback (most recent call last):
      File "C:\progs\Fichiers5.py", line 4, in <module>
        pickle.dump(a, f)
    NameError: name 'a' is not defined
    >>>

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    L"erreur se produit à la ligne 4, il s'agit donc d'un autre script.

    Effectivement les données ne sautent pas d'un script à l'autre, ce qui créerai un sacré foutoir, non ?

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut Erreur avec pickle
    Normalement le premier script crée un fichier "Monfichier" qui contient les variables a,b,c et c'est dans ce fichier (qui est existe effectivement après avoir fait "runner" le script...) que le deuxième script va chercher les variables...mais ne les trouve pas.
    Bizarre,bizarre...

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut


    Cou donc, et où donc est-ce t’y donc (comment ça, y’a trop d’donc*?) qu’il charge tes variables a, b et c depuis le fichier, ton deuxième script*?

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut Erreur avec pickle
    Bonjour,
    Ah ben, ah que... j'sais pas moi !
    Y fait pas ça tout seul ?
    Citation de Swinnen un peu plus haut dans le cours :
    "L'utilisation d'un fichier ressemble beaucoup à l'utilisation d'un livre. Pour utiliser un livre, vous devez d'abord le trouver (à l'aide de son titre), puis l'ouvrir. Lorsque vous avez fini de l'utiliser, vous le refermez. Tant qu'il est ouvert, vous pouvez y lire des informations diverses, et vous pouvez aussi y écrire des annotations, mais généralement vous ne faites pas les deux à la fois."
    On a bien écrit dans le fichier au premier script puis on l'a refermé; on l'a rouvert au deuxième script pour utiliser ce qui avait été écrit dans ce fichier...
    Et y dit qui trouve pas ??? Sait pas lire peut-être ???
    Blague à part, le problème se situe sûrement par là, mais je ne sais pas comment fonctionne un processus de transfert de données...(débutant, niveau maternelle !)

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Mais justement, tu ne lis pas ce fichier dans ton deuxième script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import pickle
    f = open('Monfichier', 'w')
    pickle.dump(a, f)
    pickle.dump(b, f)
    pickle.dump(c, f)
    ...
    Tu l'ouvres en écriture et tu éssayes directement de pickler dedans des données qui n'existent pas dans ce code.

    Copie la fin de ton premier code au début du deuxième pour recupérer tes données en premier lieu.

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut
    Si je colle au début du deuxième script la ligne : f = open('Monfichier', 'r')
    pour récupérer les données, puisque le fichier est alors en lecture, ça ne marche pas non plus.
    La seule solution que j'ai trouvée c'est de simplement coller les variables et leur valeur : a = 5 b = 2.83 c = 67 ...
    Mais alors, à quoi ça sert d'écrire dans un fichier si, pour récupérer les données, on est obligé de le faire "à la main" (copier-coller) ???

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par plumdoizo Voir le message
    Si je colle au début du deuxième script la ligne : f = open('Monfichier', 'r')
    pour récupérer les données, puisque le fichier est alors en lecture, ça ne marche pas non plus.
    'ça ne marche pas' n'est pas une information permettant d'aider.

    S'il y a un message d'erreur, il faut le coller ici, ou alors montres-nous ce code.

    Parce que moi je suis sûr que 'ça marche'.

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut
    Bonjour,
    Voilà donc(!) le code :

    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
    f = open('Monfichier', 'r')
    import pickle
    f = open('Monfichier', 'w')
    pickle.dump(a, f)
    pickle.dump(b, f)
    pickle.dump(c, f)
    f.close()
    f = open('Monfichier', 'r')
    t = pickle.load(f)
    print t, type(t)
    t = pickle.load(f)
    print t, type(t)
    t = pickle.load(f)
    print t, type(t)
    f.close()
    ...et le message d'erreur quand on l'exécute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\progs\Fichiers5.py", line 4, in <module>
        pickle.dump(a, f)
    NameError: name 'a' is not defined
    Je dois zapper quelque chose, mais quoi ?

  10. #10
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans le 2e fichier Python, tu dois considérer que le fichier pickle "Monfichier" est DEJA écrit et contient les données. Tu dois donc le lire et non écrire de nouveau a, b, et c qui ne sont pas définis dans ce 2e fichier. Il faut donc faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import pickle
     
    f = open('Monfichier', 'r')
    t = pickle.load(f)
    print t, type(t)
    t = pickle.load(f)
    print t, type(t)
    t = pickle.load(f)
    print t, type(t)
    f.close()
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    5 <type 'int'>
    2.83 <type 'float'>
    67 <type 'int'>
    A noter que d'après la doc Python, le fichier pickle devrait être ouvert en mode binaire ('rb' et 'wb').

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut
    Bonjour et merci pour ta réponse,
    Bôô non, "ça marche pas" chez moi !
    J'ai copié-collé-exécuté ton code et voilà la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "C:/progs/Fichiers6.py", line 4, in <module>
        t = pickle.load(f)
      File "C:\progs\lib\pickle.py", line 1378, in load
        return Unpickler(file).load()
      File "C:\progs\lib\pickle.py", line 858, in load
        dispatch[key](self)
    KeyError: '5
    Y-a-t-il le diable dans ma machine ?!!!
    Au passage, comment fait-on pour ouvrir pickle en mode binaire ?

  12. #12
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ben oui mais il ne suffit pas d'ouvrir le fichier en lecture pour que les données soient récupérées.

    Il faut les lire et là se posera un premier problème; c'est que les données ont été écrites l'une à la suite de l'autre.

    Donc le fichier contient actuellement ceci:
    on ne peut donc plus récupérer les données séparément.

    Il aurait fallu faire (par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    a = 5
    b = 2.83
    c = 67
    f = open('Monfichier', 'w')
    f.write(str(a) + "\n")
    f.write(str(b) + "\n")
    f.write(str(c) + "\n")
    Ensuite dans le deuxième code, commencer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    f = open('Monfichier', 'r')
    ff = open('Monfichier2', 'w')
    for dat in f.readlines():
        pickle.dump(dat, ff)
    f.close()
    ff.close()
    Ensuite on relit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    f = open('Monfichier2', 'r')
    print pickle.load(f)
    print pickle.load(f)
    print pickle.load(f)
    Il s'agit d'un exemple d'utilisation de pickle purement didactique bien sur. Ça devrait s'écrire plus proprement.

    Le mode binaire semble effectivement recommandé et est obligatoire avec Python 3.



    Edit: pour le mode binaire il faut rajouter un 'b' à l'argument
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open('Monfichier2', 'wb')
    open('Monfichier2', 'rb')

  13. #13
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut
    Bonjour,
    OK,ça fonctionne,sauf que les valeurs renvoyées par la dernière partie du code sont des strings...
    Pour retrouver des valeurs numériques, je les ai directement picklées dans le fichier; mon erreur de départ a été, je crois, de vouloir créer d'abord le fichier contenant les données et d'essayer ensuite de récupérer ces données pour les pickler dans le fichier.
    C'était bien compliqué !
    Merci pour ton aide qui m'a mis sur la voie...
    Les codes simples et qui fonctionnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import pickle
    f = open('Monfichier', 'w')
    l=['5','2.83','67']
    for n in l:
        pickle.dump(eval(n), f)
    f.close()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import pickle
    f = open('Monfichier', 'r')
    print pickle.load(f)
    print pickle.load(f)
    print pickle.load(f)
    f.close()

  14. #14
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Une remarque, comme je vois que tu pickle les trois données séparement, tu peux tout aussi bien pickler la liste elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pickle.dump([5, 273, 65, 8], f)

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 787
    Par défaut
    Salut,
    pickle.dump(object, file) va sauvegarder l'état de l'"object" Python.
    Un "object" Python est composite: il a des valeurs et/ou des attributs qui sont eux mêmes des "objects" qu'il faudra aussi sauvegarder.
    Le but étant de savoir restaurer l'"object" dans son état.
    Je dis cela parce que écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l=['5','2.83','67']
    for n in l:
        pickle.dump(eval(n), f)
    est quelque peu alambiqué:
    • l est une liste de str ressemblant à des "int" ou des "float",
    • le "for n in l" fait un eval pour les sauvegarder en tant que "int" ou "float"

    Pourquoi ne pas écrire plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L = [ 5 , 2.83 , 67] # une liste contenant des "objects" simples,
    pickle.dump(L, f) # au sauvegarde l'objet L plutôt que le contenu,
    Pour reconstruire le L dans son état, il suffit alors de faire:
    N'est ce pas plus simple?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Par défaut
    Tout à fait d'accord !
    J'ignorais qu'on pouvait pickler une liste...
    Encore merci.

  17. #17
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 787
    Par défaut
    Salut,

    Citation Envoyé par plumdoizo Voir le message
    Tout à fait d'accord !
    J'ignorais qu'on pouvait pickler une liste...
    Encore merci.
    Avant d'utiliser un module pourquoi ne pas essayer de prendre l'habitude de lire la documentation. Vous y trouvez:


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Erreur Avec Interbase
    Par smokemon dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/10/2004, 07h24
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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