Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment extraire une valeur d'un fichier ?

    2 décembre 2015 à 16:36:27

    Coucou !

    Je travaille actuellement sur un projet que j'ai à rendre prochainement pour le Lycée, et une question m'est venue en tête !

    Ayant pour objectif de développer un système d'expérience, j'ai eu l'idée de créer un fichier propre au joueur à chaque nouveau pseudo entré, avec à l'intérieur le nombre d’expérience de ce joueur. Voici la partie du code en question

        fichier = 'MasterMind_%s.txt' % pseudo
        Condition=os.path.isfile(fichier)
        if Condition == False:
            fichier = open('MasterMind_%s.txt' % pseudo,'a')
            fichier.write("0")
            fichier.close()
        else:
            fichier = open('MasterMind_%s.txt' % pseudo,'a')
            fichier.close()

    Bon, je suis conscient que niveau perf, c'est pas la joie, mais gardez en tête que c'est un programme destiné à n'être partagé qu'à mes camarades (si besoin est) et à mes examinateurs.

    Plus concrètement, voici l'objet de ma question: Comment modifier le 0 (que j'écris par défaut si le fichier n'existe pas et qui correspond à un nombre d'expérience nul) et/ou faire intervenir la valeur qu'il a pris dans mon code. Par exemple en déclarant nbExp = nbExp + x    si je veux rajouter x nombre d'exp au joueur

      Merci beaucoup ^.^

    -
    Edité par AntoineAllard 2 décembre 2015 à 16:37:41

    • Partager sur Facebook
    • Partager sur Twitter
      3 décembre 2015 à 7:47:47

      Je te conseilleirai de regarder du côté de ConfiParser pour créer des fichier de type ini. Ca marche comme un dictionnaire et ce sera plus facile pour modifier des valeurs dans un fichier texte.

      Exemple:

      import ConfigParser
      
      config = ConfigParser.ConfigParser()
      
      # On crée une section joueur1
      config.add_section("joueur1")
      
      # Dans la section joueur1 on crée une clé "nom" qui a pour valeur "test"
      config.set("joueur1", "nom", "test")
      
      # On sauvegarde le fichier
      with open("test.ini", "w") as ini:
          config.write(ini)
      
      # On lit le fichier de config pour récupérer les nouvelles infos
      config.read("test.ini")
      
      # Pour récupérer une valeur on doit donner la section et la clé:
      valeur = config.get("joueur1", "nom")
      print("Valeur:", valeur)
      
      # On peut ensuite remodifier la valeur avec un set comme précédemment puis sauvegarder le fichier et le relire
      # pour récupérer la nouvelle valeur


      Voilà, j'espère que cela t'aura aidé ^^

      • Partager sur Facebook
      • Partager sur Twitter
        3 décembre 2015 à 12:09:59

        Stocker les scores sous la forme d’un dictionnaire est une bonne idée. Je ne suis pas sur qu’un fichier ini soit le plus approprié par contre, il y a un peu de magie qui n’est pas nécessaire ici (section DEFAULT notamment). J’aurais fait ça avec le module json, rapide exemple :

        >>> import json
        >>> scores = {'megan': 0, 'toto': 3}
        >>> f = open('Mastermind_scores.txt', 'w')
        >>> json.dump(scores, f, indent=4)
        >>> f.close()
        >>> f = open('Mastermind_scores.txt', 'r')
        >>> scores_bis = json.load(f)
        >>> scores_bis
        {'toto': 3, 'megan': 0}
        >>> scores == scores_bis
        True
        >>> f.close()

        Ou alors encore plus simple avec le module shelve, mais tu n’a plus de fichier texte simple en sortie donc c’est peut être moins sympa.

        >>> import shelve
        >>> scores = shelve.open('scores', writeback=True)
        >>> scores['toto'] = 3
        >>> scores['megan'] = 0
        >>> scores.close()
        >>> del scores
        >>> scores = shelve.open('scores', writeback=True)
        >>> scores['toto']
        3
        >>> scores['megan']
        0
        >>> scores.close()
        • Partager sur Facebook
        • Partager sur Twitter
        per aspera ad astra – comp.lang.c FAQexplication pointeur
        Anonyme
          3 décembre 2015 à 13:40:37

          J'ai ma préférence pour la solution JSON. Simple et sécurisé. Alors que shelve utilise pickle, ce qui interdit tout échange externe de données sérialisées sous peine d'avoir une énorme faille de sécurité. Dans le cas d'un Mastermind, je doute qu'il soit utile de partager un fichier de sauvegarde, alors pourquoi pas.

          • Partager sur Facebook
          • Partager sur Twitter
            3 décembre 2015 à 17:07:17

            Petite question . Où shelve stock les données ? 

            Et si elles sont bien stockées et non en mémoire le temps de l'utilisation du script. Combien de temps va ton pouvoir les retrouver ? 

            • Partager sur Facebook
            • Partager sur Twitter
              3 décembre 2015 à 18:12:32

              Jo541 a écrit:

              Petite question . Où shelve stock les données ?

              Dans des fichiers sur le disque, si tu fais un rapide test tu les verras. Mais ils ne sont pas fait pour être facilement lisible avec un éditeur de texte standard.

              • Partager sur Facebook
              • Partager sur Twitter
              per aspera ad astra – comp.lang.c FAQexplication pointeur
                4 décembre 2015 à 9:58:17

                Merci talpa . La seul grosse difference que j'ai pu lire ici est là . C'est que shelve/pickel permet de store des object/function. Même si derrière il n'y a aucune système de sécurisation des données .
                • Partager sur Facebook
                • Partager sur Twitter
                  4 décembre 2015 à 15:26:28

                  Une fonction est un objet en python. Le problème avec pickle n'est pas directement un problème de sécurité, mais d'échange d'information entre les différents langages (les problèmes sont liés cependant). Une information que tu codes avec pickle ne pourra être lu par autre chose que python (et encore, pas au sens large car il peut y avoir des problèmes en fonction de la version de python utilisée).

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    4 décembre 2015 à 15:54:27

                    Pour la sécurité, effectivement Pickle est dangereux. Imagine que je créé un fichier de sauvegarde, comme-ceci :

                    class Exploit:
                        def __reduce__(self):
                            return print, ('Salut, je suis ici ! ;)', 'Flippant, non ?')
                    
                    with open('scores.pic', 'wb') as file:
                        pickle.dump(Exploit(), file)
                    

                    Je t'envoie ce fichier en te proposant de battre mon record. Eh bien au lieu de charger mes scores, ton jeu va exécuter la fonction print avec ses arguments :

                    >>> with open('scores.pic', 'rb') as file:
                    ...     x = pickle.load(file)
                    ... 
                    Salut, je suis ici !  Flippant, non ?
                    

                    >>>

                    </pre>

                    Et maintenant imagine que je remplace la fonction print par un code vraiment malicieux ? Et que je récupère toutes tes données personnelles, je les chiffres et te demande une rançon pour les déchiffrer ! smiley


                    En conclusion, avec Pickle il ne faut jamais charger des données dont on ignore le contenu ! JAMAIS !

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Comment extraire une valeur d'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