Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparer une ligne de fichier avec un string

Sujet résolu
    15 novembre 2014 à 16:39:23

    Bonsoir à tous,

    J'essaye de créer un algo qui demande à l'utilisateur soit d'enregistrer son nom et son mdp, soit de rentrer son nom et son mdp s'il est déjà enregistré, et l'algo compare ensuite ces informations avec les données du fichier texte qui contient tous les noms et les mdp des utilisateurs déjà enregistrés.

    Lors de l'étape "Connexion" je fais donc une boucle while qui va comparer successivement le nom d'utilisateur avec chaque ligne du fichier "Comptes" pour vérifier si l'utilisateur est bien enregistré.

    Mais cela crée une boucle infinie. Je pense que c'est parce que Python ne peut pas comparer une ligne d'un fichier texte avec un string, or c'est ma condition d'arrêt, donc logique que la boucle soit infinie.

    Mais dans ce cas-là comment dois-je faire ? J'ai déjà étudier plusieurs possibilités, mais je viens de reprendre le Python récemment et je n'arrive pas à comprendre la plupart des possibilités que j'ai trouvé sur internet et dans la doc Python.

    Néanmoins il y en a une que j'ai à peu près compris, c'est celle avec le pickler, mais je ne vois pas du tout comment m'y prendre avec cette fonction, car je n'ai pas souvenir de l'avoir déjà utilisé, et j'ai donc un peu de mal à m'en servir.

    Merci de l'aide que vous pourrez m'apporter, je vous met mon code Python ainsi que mon fichier texte de sauvegarde des "Comptes".

    from pickle import *
    
    
    connexion = input("Vous souhaitez vous enregistrer (1) ou vous inscrire (2) ? \n")
    str(connexion)
    
    nameFile1 = "Comptes.txt"
    nameFile2 = "Verefication.txt"
    
    
    if connexion == '1' :
    
        nameUser = input("Entrez votre nom d'utilisateur : ")
        password = input("Entrez votre mot de passe : ")
        nameUser = str(nameUser)
        password = str(password)
    
    
        file1 = open(nameFile1, "a")
    
        
        file1.write(nameUser + '\n')
        file1.write(password + '\n' + '\n')
    
        file1.close()
    
    if connexion == '2' :
    
        nameUser = input("Entrez votre nom d'utilisateur : ")
        password = input("Entrez votre mot de passe : ")
        nameUser = str(nameUser)
        str(password)
    
        a = 0
        a = str(a)
    
        file1 = open(nameFile1, "r")
    
        while a != nameUser or a != "stop " :
    
            a = file1.readline()
            a = str(a)
            print(a)
    
        if a == nameUser : print ("Connexion réussi...")
        else : print ("Connexion échouée...")
        
        
        file1.close()
    

    Le fichier "Comptes" :

    Samy
    123
    
    Paul
    123
    
    stop



    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2014 à 16:56:35

      Pourquoi tu ne stockes pas tout simplement tes identifiants et tes mots de passe dans un dictionnaire?
      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2014 à 17:13:57

        L'année dernière j'avais fais exactement le même type de programme, je viens de retrouver un très vieux post que j'avais fais à ce sujet justement. Et j'avais utilisé des dictionnaires pour associer les noms et les mdp, mais je ne me rappelle plus du tout comment utiliser le module pickle pour gérer mes dictionnaires dans un fichier.

        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2014 à 18:04:43

          Maintenant que j'utilise le module pickle pour pouvoir exprès mettre des objets dans un fichier, Python me dit que la fonction pickle.dump() doit prendre un string en argument et non un "bytes" WTF ?

          Voici mon code : 

          from pickle import *
          
          
          connexion = input("Voulez-vous vous enregistrer (1) ou vous connecter (2) : ")
          str(connexion)
          
          
          if connexion == '1' :
          
              nameUser = input("Veuillez entrer votre nom d'utilisateur : ")
              password = input("Veuillez entrer votre mot de passe : ")
          
              login = dict()
              login [nameUser] = password
              
          
              fileName = "Login.txt"
              fileLogin = open(fileName, "a")
              monPickler = Pickler(fileLogin)
              monPickler.dump(login)
              fileLogin.close()
          
              fileLogin = open(fileName, 'r')
              monDepickler = Unpickler(fileLogin)
              print(monDepickler.load())
          
              
          
          elif connexion == 2 :
              

          Et le message d'erreur que je reçois :

          line 20, in <module>  monPickler.dump(login)
          TypeError: must be str, not bytes
          



          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            15 novembre 2014 à 18:16:14

            Salut BreizhRyder,<br/> J'aimerai corriger quelques points sur ton code:

            • Premièrement, la fonction str retourne une chaîne de caractère, mais ne réaffecte pas l'objet passé en argument. Cela signifie qu'aux lignes 5 et 32, tu retournes une chaîne de caractère dans le vide.
            • Ensuite, la fonction input renvoie aussi une chaîne de caractère, donc il est inutile de convertir les variables qui en résulte en chaîne de caractère (cf. lignes 5, 15, 16, 31 et 32).
            • Lorsqu'on travaille de la sorte sur un fichier, on préfère utiliser la syntaxe with open(path) as file qui a pour avantage d'être plus propre car le fichier est fermé automatiquement à la fin du bloc. Je t'invite à jeter un coup d'oeil au lien que t'a donné Derzal pour plus d'informations.
            • Une ligne de fichier est de type str, donc ton problème n'est pas issu de ça.

            Alpha.

            Edit: Ce post de réfère au code que tu as posté avant ;)

            Edit 2: L'erreur TypeError: must be str, not bytes vient du fait que l'on ne peut pickler que dans un fichier ouvert en binaire. Pour ce faire il te suffit de rajouter un petit b après le mode d'ouverture, comme ça: fileLogin = open(fileName, 'ab')

            -
            Edité par Anonyme 15 novembre 2014 à 18:32:00

            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2014 à 18:31:41

              Pour ta remarque sur les fonctions str() et input() AlphaZeta, j'ai pris l'habitude de les mettre car la je suis sur mon PC avec Python 3.X, mais à l'école où je suis (Ecole Nationale d'Ingénieurs de Brest, je sais pas si tu connais), on est encore sous la version 2.X de Python, et en 2.X il n'est pas content si tu ne convertis pas ton input en str(), je sais plus exactement pourquoi mais il y a un truc comme ça, c'est simplement pour ça que je les met, pas habitude.

              Mais maintenant j'aimerais bien avoir une petite solution pour le deuxième code que j'ai posté ^^ Merci d'avance.

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                15 novembre 2014 à 18:37:03

                Si tu es sous Python 2, la fonction input (remplacée par eval en Python 3) exécute le code reçu en argument. Pour simplement récupérer une entrée, utilise la fonction raw_input (remplacée, elle, par input). Pour la solution, j'ai édité mon message précédent ;). <br/> PS: Non désolé je connais pas ton école, je suis encore au lycée :)

                -
                Edité par Anonyme 15 novembre 2014 à 18:37:53

                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2014 à 19:51:38

                  D'accord, merci pour ta réponse, ça répond à ma question. Mais du coup ça veut dire que je ne pourrai jamais lire moi-même directement ce qui est marqué dans le fichier ? Je serai toujours obligé de le retranscrire avant du binaire en normal ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 novembre 2014 à 20:01:32

                    Si tu passes par pickle et enregistre des objets complexes, oui. Par contre tu peux bien sur lire directement un fichier txt dans lequel il y a juste des chaines de caractères.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      15 novembre 2014 à 21:55:03

                      Il y a le module json qui te permet de sauvegarder tes objets sous un format human-readable. Ça s'utilise comme ça:

                      import json
                      
                      with open('login_data.json') as f:
                          d = json.load(f)
                          # faire des trucs avec d
                      with open('login_data.json', 'w') as f:
                          json.dump(d, f, indent=4, sort_keys=True)

                      Edit: Quelques liens pour te familiariser avec ce module ;):

                      -
                      Edité par Anonyme 15 novembre 2014 à 21:58:36

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 novembre 2014 à 11:21:44

                        D'accord, merci beaucoup Derzal et AlphaZeta pour vos réponses, vous m'avez grandement aidé, et vous avez clairement répondu à mes questions. Ce post peut donc être clôt. Merci encore.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Comparer une ligne de fichier avec un string

                        × 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