Partage
  • Partager sur Facebook
  • Partager sur Twitter

Stocker un dictionnaire dans un fichier

    7 décembre 2015 à 21:19:38

    Bonjour,

    Je voulais me lancer en faisant un petit bulletin de note avec une structure de données spéciale qui est le dictionnaire (bien adapté pour lier les matières à la liste de notes)

    Voici donc la structure de cette donnée :

    {'matiere':[(note1,coef),(note2,coef)],'matiere2':[(note1,coef),(note2,coef)]}

    Un simple dictionnaire qui lit le nom de la matière avec une liste de tuple (note,coef).

    A manipuler, ce n'est pas bien compliqué, mais c'est au stockage que cela me pose problème : j'aimerai le stocker dans un fichier !

    Par exemple, mon fichier notes.txt qui stock le dictionnaire et me permet donc de le recupérer :

    notes.txt :

    {'matiere':[(note1,coef),(note2,coef)],'matiere2':[(note1,coef),(note2,coef)]}

    et mon code est le suivant :

    notes.py :
    fonction d'affichage des notes

    def afficher_notes():
    	dictionnaire=appeler_dictionnaire(fichier)
    	for (matiere,notes) in dictionnaire:
    		print(matiere)
    		print('-'*40)
    		print('Note'.ljust(20),'Coefficient'.ljust(20))
    		for (note,coefficient) in notes:
    			print(note.ljust(20), coefficient.ljust(20))


    fonction d'appel du dictionnaire :

    def appeler_dictionnaire(fichier):
    	fic=open(fichier,'r')
    	dictionnaire= fic.readline()
    	return dictionnaire

    J'imagine très bien que mon dictionnaire est retourné comme un STR. Et je n'ai pas trouvé (même la doc en anglais) comment pouvoir le retourné en dictionnaire, comme tel, ça n'existe peut-être pas

    Comment puis-je faire ?
    Ou sinon, une autre manière de stocker l'information de façon permanente (je n'ai aucune idée en faite...) ?

    Cordialement,

    Julien

    • Partager sur Facebook
    • Partager sur Twitter

    Site personnel : Julien Gidel - AutoMatePHPresentation

      7 décembre 2015 à 22:18:10

      Tu peux utiliser literal eval pour ça, cependant je pense qu'il vaudrait mieux dans ton cas l'encoder d'une autre manière, genre un bon csv. Si jamais ça t'intéresses, tu pourrais regarder ce que tu peux faire avec la librairie pandas. C'est adapté pour ces structures.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        7 décembre 2015 à 22:52:24

        Je ne vois pas du tout ce que vient faire le module ast dans ce sujet ? o_O

        La meilleure solution reste, comme dans 90% des cas où il est question d'enregistrer des données structurées dans un fichier texte, le module json :

        import json
        
        notes = { 'a' : [(1, 2), (2, 1)], 'b' : [(2, 2), (1, 1)] }
        
        # Enregistrer le dictionnaire dans un fichier :
        with open('notes.txt', 'w') as file:
            json.dump(notes, file)
        
        # Charger le dictionnaire depuis un fichier :
        with open('notes.txt', 'r') as file:
            notes = json.load(file)
        

        -
        Edité par Anonyme 7 décembre 2015 à 22:53:27

        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2015 à 23:45:57

          Merci pour vos réponses.

          J'ai testé ta solution celthon et la doc json est vraiment mal foutue pour quelqu'un qui ne connait pas ce module ...

          bref, j'ai maintenant ce texte dans notes.txt :

          {"matiere":[(12,1),(15,1)],"matiere2":[(13,1),(14,1)]}

          Et dans mon .py :

          def appeler_dictionnaire(fichier):
          	with open(fichier, 'r',encoding='utf-8') as file:
          		notes = json.load(file)
          	return notes
          
          def sauvegarder(dictionnaire):
          	with open('notes.txt', 'w',encoding='utf-8') as file:
          		json.dump(dictionnaire, file)

          et l'erreur qu'il me renvoie est : 

           File "notes.py", line 9, in appeler_dictionnaire
              notes = json.load(file)
            File "json\__init__.py", line 268, in load
            File "json\__init__.py", line 319, in loads
            File "json\decoder.py", line 339, in decode
            File "json\decoder.py", line 357, in raw_decode
          json.decoder.JSONDecodeError: Expecting value: line 1 column 13 (char 12)
          Appuyez sur une touche pour continuer...



          Expecting value ? Il manque pourtant rien de ce que j'ai vu sur la doc... Ai-je mal compris le load ?

          • Partager sur Facebook
          • Partager sur Twitter

          Site personnel : Julien Gidel - AutoMatePHPresentation

            7 décembre 2015 à 23:46:26



             Bonsoir Jules04,

            Outre la solution de Celthon, une autre existe avec le module pickle.

            On suppose dans cet exemple un fichier nommé fichier qui va contenir un dictionnaire nommé dico.

            N'oublie pas de prévoir un traitement d'exception au cas où tu rechargerais dico avant de l'avoir créé.

            A+

            from pickle import dump,load
            
            #sauvegarde
            dfg=open(fichier,'wb')
            dump(dico,dfg)
            dfg.close()
            
            #recharge
            aze=open(fichier,'rb')
            dico=load(aze)
            aze.close()
            • Partager sur Facebook
            • Partager sur Twitter
              7 décembre 2015 à 23:59:42

              Merci pour cette réponse !

              Je tente ça demain. j'ai regardé vite fait et il me met une erreur, alors je regarde la doc demain :)

              bonne nuit ! 

              • Partager sur Facebook
              • Partager sur Twitter

              Site personnel : Julien Gidel - AutoMatePHPresentation

              Anonyme
                8 décembre 2015 à 0:35:04

                Oui, les tuples n'existent pas en JSON, il sont remplacé par des listes :

                >>> import json
                >>> notes = {"matiere":[(12,1),(15,1)],"matiere2":[(13,1),(14,1)]}
                >>> json.dumps(notes)
                '{"matiere2": [[13, 1], [14, 1]], "matiere": [[12, 1], [15, 1]]}'
                >>> json.loads(_)
                {'matiere2': [[13, 1], [14, 1]], 'matiere': [[12, 1], [15, 1]]}
                

                Ça ne change rien au reste de ton script, juste que si tu dois remplir manuellement ton fichier JSON, utilise des crochets au lieu des parenthèses. ;)

                • Partager sur Facebook
                • Partager sur Twitter
                  8 décembre 2015 à 14:26:07

                  Pour compléter le message de celthon, tu peux toujours repasser en tuples derrière si tu y tiens. Par exemple (Python3) :

                  >>> import json
                  >>> notes = {"matiere":[(12,1),(15,1)],"matiere2":[(13,1),(14,1)]}
                  >>> json.dumps(notes)
                  '{"matiere": [[12, 1], [15, 1]], "matiere2": [[13, 1], [14, 1]]}'
                  >>> note_bis = json.loads(_)
                  >>> print(note_bis)
                  {'matiere': [[12, 1], [15, 1]], 'matiere2': [[13, 1], [14, 1]]}
                  >>> note_bis = {k : list(map(tuple, v)) for k, v in note_bis.items()}
                  >>> print(note_bis)
                  {'matiere': [(12, 1), (15, 1)], 'matiere2': [(13, 1), (14, 1)]}
                  • Partager sur Facebook
                  • Partager sur Twitter
                  per aspera ad astra – comp.lang.c FAQexplication pointeur
                  Anonyme
                    8 décembre 2015 à 15:15:57

                    À choisir je choisirais aussi JSON, tout simplement pour deux raisons,

                    pickle à un trou de sécurité

                    The pickle module is not secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.

                    JSON est nettement plus efficace

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 décembre 2015 à 19:06:38

                      Merci pour toutes ces réponses ! toutes très efficaces !

                      Merci celthon, c'est ce qui me manquait, ducoup j'ai simplement utilisé les index pour récupérer mes valeurs.

                      @talpa : je prend note !!! C'est pas mal comme truc, je l'ai mis dans un fichier sur mon pc, ça me servira surement !

                      @oldProgrammer : Merci à toi aussi pour cette précision. J'ai choisis Json ducoup, vu que celthon a vite répondu. Ne pas utiliser pickle, c'est ce que je retiens :p

                      merci à tous !

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Site personnel : Julien Gidel - AutoMatePHPresentation

                      Stocker un dictionnaire dans un fichier

                      × 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