Arrêt boucle condition

Fermé
yayakol Messages postés 3 Date d'inscription dimanche 16 août 2020 Statut Membre Dernière intervention 17 août 2020 - 16 août 2020 à 19:13
yg_be Messages postés 23330 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 - 18 août 2020 à 09:02
Bonjour tout le monde,
Après pas mal de recherches je n'arrive pas à arrêter une boucle quand je le souhaite. Étant débutant je pense que je m'y prends mal... Voici le code :

with open("f.txt", "r") as f, open("f2.txt", "r") as f2, open("ff.txt", "w") as output1:
    while True:
        text1 = f.readline()
        text2 = f2.readline()
        if not text1 and not text2:
            break
        nb_mots_t1 = len(text1.split()) 
        nb_mots_t2 = len(text2.split())
        ecart_max = 3
        if nb_mots_t1-nb_mots_t2>ecart_max:
            text2 = text2.replace('\n', ' ')
            output1.write(text2)
            break
        else:
            output1.write(text2)


En fait, je cherche à modifier un texte en fonction du nombre de mots d'un autre texte. Le problème, c'est que l'instruction break arrête ma boucle juste avant là ou je veux qu'elle s'arrête, c'est-à-dire la phrase d'après (du coup, la ligne text2 = tex2.replace('\n', ' ') ne s'effectue pas, alors que je veux qu'elle s'arrête juste après l'exécution).

Merci par avance

2 réponses

yg_be Messages postés 23330 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 Ambassadeur 1 551
17 août 2020 à 09:00
bonjour, l'autre problème, c'est que tu ne nous expliques pas ce que tu souhaites que ton code fasse précisément, ni ne nous donnes d'exemple de ce que tu obtiens et de ce que tu souhaites obtenir.
tu écris "l'instruction break", alors que tu en as deux: pourquoi ne pas préciser le numéro de ligne?
peut-être suffit-il de déplacer les ligne 5 et 6 après la ligne 15?
0
yg_be Messages postés 23330 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 1 551
17 août 2020 à 09:05
il est parfois plus clair de faire ainsi, plutôt que
while true
:
fini= False
while not fini:
   # ...
   fini = not text1 and not text2
   # ...   
0
yayakol Messages postés 3 Date d'inscription dimanche 16 août 2020 Statut Membre Dernière intervention 17 août 2020
17 août 2020 à 13:15
Bonjour, merci pour ta réponse, mais du coup ça donne exactement le même résultat. Déjà (on m'avait aidé), j'arrive pas tellement à comprendre le sens de not dans une boucle avec while true, tout comme l'exemple que tu viens de donner... Bref, visiblement ce n'est pas là où se situe mon problème mais plutôt au positionnement de break. Quand tu dis "pourquoi ne pas préciser le numéro de ligne", on peut le faire sur l'instruction break ? J'ai pas mal cherché dans ce sens, ou encore avec la position du curseur interne mais j'ai rien trouvé... Voici des exemples concrets pour y voir plus clair (chaque bla étant un mot) :
text1 :
bla bla
bla bla
bla bla bla
bla bla bla bla bla bla bla bla bla bla

text2 :
bla bla
bla bla
bla bla bla
bla bla bla bla bla 
bla bla bla bla bla


Du coup, je calcul le nombre de mots lignes par lignes en comparant les deux fichiers. Dès qu'il y a un écart supérieur à trois mots, on enlève le saut de charrue pour que la ligne 5 du text2 se mette au niveau de la 4 :

bla bla
bla bla
bla bla bla
bla bla bla bla bla bla bla bla bla bla


Pour l'instant, l'écriture de mon fichier (qui recopie donc le text2) s'arrête à la ligne 4, sans exécuter le saut de charrue. Si j'enlève l'instruction break (la deuxième sur mon code) ça fonctionne mais ça continue de le faire sur tout le texte, or ce que je souhaite, c'est qu'après la suppression du saut de charrue, je puisse recommencer la lecture à la position 0, ou, pour bien faire, à la ligne 4, puisque c'est là où ma condition est remplie (nombre supérieur de trois mots). Bon, j'ai conscience que je cherche peut-être à faire un truc qui n'est pas de mon niveau (et qui est d'ailleurs, in fine, pas réalisable) mais sans forcément donner du code si je pouvais avoir quelques conseils ? Merci :)
0
yg_be Messages postés 23330 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 1 551 > yayakol Messages postés 3 Date d'inscription dimanche 16 août 2020 Statut Membre Dernière intervention 17 août 2020
17 août 2020 à 14:13
Quand j'écris "pourquoi ne pas préciser le numéro de ligne", je pensais: nous indiquer à quelle ligne se trouve le break auquel tu fais référence?

tu écris "ça donne exactement le même résultat", et tu ne nous montres pas ce que tu as essayé.

pourquoi fais-tu un exemple avec tous les mots identiques? pour éviter que nous comprenions?
complete également ton exemple pour montrer comment tu veux continuer après avoir supprimé un passage à la ligne.

quel sens donnes-tu au mot "charrue" dans ce contexte?

souhaites-tu améliorer ton niveau? alors, je suggère de commencer par des exercices plus simples.
0
yayakol Messages postés 3 Date d'inscription dimanche 16 août 2020 Statut Membre Dernière intervention 17 août 2020
17 août 2020 à 15:37
Ah, autant pour moi.

Du coup, j'ai essayé les deux choses que tu m'avais recommandé :
1) déplacer les lignes 5 et 6 après la 15
with open("f.txt", "r") as f, open("f2.txt", "r") as f2, open("ff.txt", "w") as output1:
    while True:
        text1 = f.readline()
        text2 = f2.readline()
        nb_mots_t1 = len(text1.split()) 
        nb_mots_t2 = len(text2.split())
        ecart_max = 3
        if nb_mots_t1-nb_mots_t2>ecart_max:
            text2 = text2.replace('\n', ' ')
            output1.write(text2)
            break
        else:
            output1.write(text2)
        if not text1 and not text2:
            break


J'obtiens donc, en écriture :

bla bla
bla bla
bla bla bla
bla bla bla bla bla


Si j'enlève le break (ligne 11), j'ai ce que je veux, mais ça poursuit sur tout le texte.

2) En enlevant while True
with open("f.txt", "r") as f, open("f2.txt", "r") as f2, open("ff.txt", "w") as output1:
    fini = False 
    while not fini:
        text1 = f.readline()
        text2 = f2.readline()
        fini = not text1 and not text2
        nb_mots_t1 = len(text1.split()) 
        nb_mots_t2 = len(text2.split())
        ecart_max = 3
        if nb_mots_t1-nb_mots_t2>ecart_max:
            text2 = text2.replace('\n', ' ')
            output1.write(text2)
            break
        else:
            output1.write(text2)


Même résultat, l'écriture du text2 s'arrête à la ligne 4, si j'enlève le break (ligne 13) j'ai ce que je veux mais ça continue sur tout le texte.

Non je cherchais pas spécialement à cacher la compréhension, ça n'a simplement pas d'intérêt, et puis je pense que j'ai quand même pas mal montrer mon code justement. Je voulais dire part saut de charrue la suppression du passage à la ligne. Après, comme je l'ai dit, on repositionne le pointeur à 0, ou sur la ligne concernée si possible, pour faire la même opération mais sur le texte 1.

Oui, après je préfère m'exercer sur quelque chose de concret qui m'intéresse plutôt que d'apprendre avec des exemples vagues, où je n'y vois pas d'utilité. C'est peut-être plus long et plus dur, mais au moins les choses que j'apprends son vraiment intégrées car j'aurais essayé quinze mille solutions et passé des heures sur les forums et les tutos... et ça m'a d'ailleurs permis de pas trop mal progresser
0
yg_be Messages postés 23330 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 1 551
18 août 2020 à 09:02
il s'agit d'alors de chariot, pas de charrue: https://fr.wikipedia.org/wiki/Retour_chariot
tu ne nous permet pas de comprendre ce que tu veux obtenir en nous montrant un code qui ne fait pas ce que tu veux obtenir.
0