Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de parseur

Sujet résolu
    27 mai 2011 à 21:23:45

    Bonjour , :D

    J'ai un petit problème et je vois pas trop pourquoi sa ne marche pas.
    Je souhaiterais faire un petit programme qui récupère dans un fichier le texte uniquement entre crochet( [ et ] )

    Le problème qui se trouve apparemment à la ligne 5, en effet il ne commence pas la lecture alors que la première ligne contient bien du texte. Et j'ai vérifier readline() renvoie bien une chaine.

    Je préviens tout de suite mon code est moche. :honte:

    from os import chdir
    
    def recupinfo(fichier): #Fonction qui tri le contenu
        z=-1
        while fichier.readline() != '': #Si on arrive à une ligne où il a rien on s’arrête
            x=0
            chaine = fichier.readline() #On attribut la ligne courant à une chaine
            while x < len(chaine):
                if chaine[x] == '[':    #On cherche un crochet ouvrant
                    while y < len(chaine): 
                        if chaine[y] == ']':   #Puis un fermé 
                            z=z+1
                            while x<=y:     #On met les caractères entre les crochets dans une global
                                global info
                                info[z] = info[z] + chaine[x]
                                x =x +1
            x=x+1
            
    fichier = open('config.txt','r') #Ouverture du fichier
    
    
    recupinfo(fichier)
    
    try:     #Petit test pour éviter les erreurs avec la global
        print(info)
    except:
        print("Pas d'information a récupérer")
    
    input()
    
    fichier.close()
    


    Merci de votre aide
    :ange:
    • Partager sur Facebook
    • Partager sur Twitter
      27 mai 2011 à 21:31:20

      Salut,

      Sa viens pas simplement du fait, que dans le while tu lis le fichier sans récupérer la ligne ?
      (a la ligne 5 justement)
      • Partager sur Facebook
      • Partager sur Twitter
        27 mai 2011 à 21:37:35

        J'ai mis le chaine = fichier.readline() avant comme ceci :

        def recupinfo(fichier):
            z=-1
            chaine = fichier.readline()
            while chaine != '':
                x=0
                chaine = fichier.readline()
                while x < len(chaine):
                    if chaine[x] == '[':
                        while y < len(chaine):
                            if chaine[y] == ']':
                                z=z+1
                                while x<=y:
                                    global info
                                    info[z] = info[z] + chaine[x]
                                    x =x +1
                x=x+1
        


        Et malheureusement sa marche toujours pas :(
        • Partager sur Facebook
        • Partager sur Twitter
          27 mai 2011 à 21:40:05

          Mais même comme sa la première ligne n'est pas traiter...
          Regarde, tu la lis, après tu rentre dans le while puisqu'elle est pas null mais tout de suite après tu lis une deuxième ligne. Il est donc normale que la première soit pas traiter.

          • Partager sur Facebook
          • Partager sur Twitter
            27 mai 2011 à 21:43:11

            def recupinfo(fichier):
                z=-1
                chaine = fichier.readline()
                while chaine != '':
                    x=0
                    while x < len(chaine):
                        if chaine[x] == '[':
                            while y < len(chaine):
                                if chaine[y] == ']':
                                    z=z+1
                                    while x<=y:
                                        global info
                                        info[z] = info[z] + chaine[x]
                                        x =x +1
                    x=x+1
            


            Même la cela ne marche pas.
            De plus ma deuxième ligne contient elle aussi du texte donc sa devrait marcher :(
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              27 mai 2011 à 21:46:43

              Tiens j'aurais utilisé le module re pour faire ça

              ou la méthode replace()
              • Partager sur Facebook
              • Partager sur Twitter
                27 mai 2011 à 21:49:06

                Je suis en train d'apprendre l'utilisation des fichiers, et mon livre n'en parle pas mais sa à l'air pas mal je regarderais après
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  27 mai 2011 à 23:04:20

                  Visiblement tu n'as pas encore vu l'opérateur for, donc on va faire sans.

                  Le but du jeu c'est de lire un texte et d'en ressortir tout ce qui se trouve entre les crochets '[' et ']'. On va dire aussi qu'un crochet ouvrant n'a pas forcément son crochet fermant sur la même ligne (sinon ce serait trop simple) et il sera aussi possible d'avoir plusieurs groupes d'info entre crochet, tout au long du texte. Et puis on va aussi interdire les variables globales et l'utilisation de plus d'une boucle while dans la fonction. Cette dernière interdiction va t'obliger à utiliser une boucle infini dont on ne pourra sortir que grâce à l'opérateur break.

                  Si je t'impose ces conditions c'est pour t'amener à un code plus simple, plus propre et plus performant.


                  Voici comment devra se comporter ta fonction :
                  funct (arg 1 -> filedesc)
                      
                      définir rec comme étant un booléen (valant Faux au début)
                      définir ls  comme étant une liste (vide au début)
                      définir s   comme étant une chaine (vide au début)
                      
                      :Boucle_infini:
                          définir c comme étant le prochain caractère lu dans le fichier (filedesc.read(1))
                          
                          si c vaut une chaine vide :
                              quitter la boucle_infini (break)
                              
                          si c est_égale_à ']' et rec vaut Vrai :
                              ajouter s à ls
                              redéfinir s comme étant une chaine vide
                              définir rec à Faux
                          
                          sinon_si rec vaut Vrai (mais c n'est pas égale à ']') :
                              ajouter c à s
                          
                          sinon_si c est_égale_à '[' et rec vaut Faux :
                              définir rec à Vrai
                      
                      renvoyer la liste ls contenant toutes les chaines d'info récupérés


                  rec pour "recording"
                  ls pour "list"
                  s pour "string"
                  c pour "character"


                  Bonne chance. ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mai 2011 à 18:31:23

                    J'ai finalement trouver un moyen tout bête. on peut récupérer extraire des éléments d'une chaine en faisant chaines[x:y] :p

                    Donc voilà mon code qui marche même si il est très moche:
                    from os import chdir
                    
                    def recupinfo(fichier):
                        info = []
                        x=0
                        y=0
                        w=0
                        chaine = fichier.readline()
                        while chaine != '':
                            while x < len(chaine):
                                if chaine[x] == '[':
                                    while y < len(chaine):
                                        if chaine[y] == ']':
                                            info.append(chaine[x:y+1])
                                        y=y+1
                                x=x+1
                            w=w+1
                            y = 0
                            x= 0
                            chaine = fichier.readline()
                        return info                
                            
                    fichier = open('config.txt','r')
                    try:
                        truc = ['']
                        truc = recupinfo(fichier)
                        print(truc)
                    except:
                        print("Pas d'information a recuperer")
                        input()
                    fichier.close()
                    
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème de parseur

                    × 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