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 :

Fonction de lecture de .txt -> boucle infinite lors qu'appellée une 2e fois


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Par défaut Fonction de lecture de .txt -> boucle infinite lors qu'appellée une 2e fois
    Bonjour,

    Je suis en train de monter un model de "livre dont vous êtes le héro" en Python 2. J'utilise les fichiers textes pour chaque "cellule" où l'action se passe. Lorsque je change de cellule, je lis un autre fichier texte. J'ai réussi à tout faire fonctionner sans problème pour une première cellule mais dès que j'entre dans une 2e, j'arrive sur une boucle infinie. Pourtant, le 2e fichier n'est qu'un copier coller du premier.

    J'utilise le marquer "=END CHOICE TEXT=\n" pour voir la fin d'une section puisqu'il y a d'autre élément à trouver dans le fichier et cette section est répétée plusieurs fois par fichier.

    Boucle où ça "plante":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                while line != "=END CHOICE TEXT=\n":
                    line = line.rstrip('\n')
                    choice_text.append(line)
                    line = file.readline()
    Voici la fonction au complet :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
        def load(self):
     
            directory = str(self.title) + '/Levels/' + str(self.coords[0]) + '=' + str(self.coords[1])
            file = open(directory, 'r')
            file.seek(0)
            line = file.readline()
            while line != "=END TEXT=\n":
                line = line.rstrip('\n')
                self.entry_txt.append(line)
                line = file.readline()        
     
            line = file.readline()
            while line != "=END CHOICE=\n":
                if line != "\n":
                    line = line.rstrip('\n')
                    self.choices.append(line)
                    line = file.readline()
                else:
                    line = file.readline()
     
            line = file.readline()
            for choices in range(len(self.choices)):
                choice_text = []
                while line != "=END CHOICE TEXT=\n":
                    line = line.rstrip('\n')
                    choice_text.append(line)
                    line = file.readline()
                self.choices_txt.append(choice_text)
                line = file.readline()
     
            for choices in range(len(self.choices)):
                line = line.rstrip('\n')
                death = int(line)
                self.death.append(death)
                line = file.readline() # Line is a 0=0 value at this point
                line = line.rstrip("\n")
                line = line.split("=")
                target = [int(line[0]), int(line[1])]
                self.target_coords.append(target)
     
                line = file.readline() # Line is a =END TARGET STATE= if dead is 0, text if dead is 1
     
                if death == 1:
                    death_txt = []
                    while line != "=END TARGET STATE=\n":
                        line = line.rstrip("\n")
                        death_txt.append(line)
                        line = file.readline() # Line is a sentence until it reaches the =END TARGET STATE= value.
                    self.death_txt.append(death_txt)
                else:
                    self.death_txt.append('')
     
                line = file.readline() # Line is either 0/1 for the dead state or \n for the last line    
     
                if line == "\n":
       		        break
                else:
       		        continue
            file.close()
            return
    Et voici le fichier qui est lu par la fonction:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    FIRST FILE FIRST FILE
    FIRST FILE FIRST FILE
    =END TEXT=
    1. First Choice
    2. Second Choice
    3. Third Choice
    =END CHOICE=
    First Choice text to display
    First choice second line
    =END CHOICE TEXT=
    Second Choice text to display
    Second choice second line
    =END CHOICE TEXT=
    Third Choice text to display
    Third choice third line
    =END CHOICE TEXT=
    0
    0=1
    =END TARGET STATE=
    0
    1=0
    =END TARGET STATE=
    1
    0=0
    Some nice explanation of why the character died.
    On two lines.
    =END TARGET STATE=
    La question est, pourquoi est-ce que ça fait une boucle infinie lorsque cette fonction est utilisée pour une 2e fois? Je sais que le 2e fichier que je tente de lire est lisible, je l'ai testé à part. J'ai des boucles qui utilise le même procédé de marqueur avant celle qui plante et qui vont très bien. J'ai essayer de modifier le marqueur (enlever \n) ou d'ajouter une condition (or if line!= "=END TARGET TEXT=") mais là c'est lors de la première utilisation que ça plante.

    P.S.: Le reste du code peut ne pas être exact et apporter à d'autre problème plus tard, je commence à peine sur ça et c'est la première fois que j'utilise des class dans python alors j'ai peut-être encore mal compris certains concepts. S.V.P., ne pas en tenir compte, j'ai envie de les trouver moi-même

    EDIT: J'ai trouvé. C'est tout bête. J'utilisais un "for x in range(len(self.choices)):" mais je ne vidais pas la liste de self.choices de la première utilisation. Erreure de débutant de OO. J'ai ajouté des del self.choices[:] en début et tout fonctionne. J'effacerais bien le thread mais je ne sais pas comment.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kaivo Voir le message
    EDIT: J'ai trouvé. C'est tout bête. J'utilisais un "for x in range(len(self.choices)):" mais je ne vidais pas la liste de self.choices de la première utilisation. Erreure de débutant de OO. J'ai ajouté des del self.choices[:] en début et tout fonctionne. J'effacerais bien le thread mais je ne sais pas comment.
    Salut
    Avant il y avait un bouton de "délestage" permettant d'effacer le thread lors du nettoyage du forum mais il a disparu.
    Pas grave, je vais en profiter pour optimiser un peu ce code...

    Citation Envoyé par Kaivo Voir le message
    Voici la fonction au complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        def load(self):
     
            directory = str(self.title) + '/Levels/' + str(self.coords[0]) + '=' + str(self.coords[1])
            file = open(directory, 'r')
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            file=open(
                "%s/Levels/%d=%d" % (
                    self.title,
                    self.coords[0],      
                    self.coords[1],
                ),
                "r",
            )

    Citation Envoyé par Kaivo Voir le message
    Inutile

    Citation Envoyé par Kaivo Voir le message
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                if line != "\n":
                    line = line.rstrip('\n')
                    self.choices.append(line)
                    line = file.readline()
                else:
                    line = file.readline()
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                if line != "\n": self.choices.append(line.rstrip("\n"))
                line = file.readline()

    Citation Envoyé par Kaivo Voir le message
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                line = line.rstrip('\n')
                death = int(line)
                self.death.append(death)
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
                self.death.append(int(line.rstrip("\n"))
    Citation Envoyé par Kaivo Voir le message
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                line = file.readline() # Line is a 0=0 value at this point
                line = line.rstrip("\n")
                line = line.split("=")
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
                line=file.readline().rstrip("\n").split("=")
    Citation Envoyé par Kaivo Voir le message
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                else:
       		        continue
    Inutile
    Bon c'est à peu près tout ce que je vois dans l'immédiat. Sauf peut-être essayer de privatiser tes membres qui n'ont pas besoin d'être vu de l'extérieur de ta classe (remplacer par exemple self.death par self.__death). Comme ça tu ne seras pas venu pour rien.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture fichier txt via fonction FTP ascii
    Par kitty2006 dans le forum SAP
    Réponses: 1
    Dernier message: 30/03/2010, 10h07
  2. Réponses: 5
    Dernier message: 15/09/2005, 14h05
  3. Réponses: 6
    Dernier message: 15/09/2005, 14h04
  4. Réponses: 12
    Dernier message: 14/06/2004, 13h06
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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