Forum Programmation.python Question boucle

Posté par . Licence CC by-sa.
Tags : aucun
0
5
jan.
2020

Bonjour,

Je souhaite lire un fichier et que la boucle me le lise tant qu'il y a du texte dedans.
Il s'agit ici d'un exercice donnée mais je ne comprends pas la boucle.

with open('/home/jaared/Formations/Python/Exercices/texte.txt', 'r') as f: 

    size_to_read = 100
    f_content = f.read(size_to_read)

    while len(f_content) > 0:
        print(f_content, end="")
        f_content = f.read(size_to_read)

Je ne comprends pas comment la dernière ligne modifie la variable f_content.
Comment cette variable se retrouve modifié pour que l'on sort de la boucle ?

Je vous remercie d'avance pour votre aide.

  • # open/read

    Posté par . Évalué à 4 (+3/-0).

    En mode grinçant, je tendrais à dire que je ne comprends pas ce que tu ne comprends pas :p

    Plus sérieusement, je pense qu'il te faudrait intégrer le fonctionnement des méthodes open et read…
    Le principe est assez simple en fait: la fonction open te donne accès au contenu par le biais d'un curseur (un pointeur indiquant une position dans le fichier, positionné par défaut au début du contenu). La fonction read te renvoit un certains nombre de caractères lus (max. 100 dans ton cas) et déplace le curseur d'autant, éwala!

    ++
    Gi)

    • [^] # Re: open/read

      Posté par . Évalué à 5 (+4/-0).

      Et le plus "grincant" c'est que la première utilisation de f_content avant la boucle while ne semble lui poser aucun problème, mais dans la boucle tout d'un coup y comprend plus …
      Ou alors c'est la déclaration de bloc par indentation qui lui pose problème.
      Donc c'est juste le premier paragraphe du premier chapitre de l'apprentissage de Python qu'il faudrait qu'il relise … si tant est qu'il l'ait lu avant de faire ses devoirs pour demain …

  • # A tatons

    Posté par . Évalué à 2 (+1/-0).

    Pas besoin d'être grinçant, c'est bien read() qui pose "problème" ici.

    La doc de de python est peu claire sur la notion de curseur avec read() dans le module de base IO :

    https://docs.python.org/3/library/io.html?highlight=read#io.IOBase

    Rien n'y est indiqué sur un curseur à part que l'objet IO est un stream, cela peut donc prêter à confusion.

    Pis bon, lire un fichier x bytes à la fois avec while, c'est bien pour "optimiser" ou si on est pas sur de ce qu'il y a dans le fichier ou si on veut se la jouer "je viens du C".

    Sauf que open() propose une option de buffer qui optimise déjà la chose.

    Donc, si on veut JUSTE lire un fichier, avec une politique simple et stupide :
    On transforme f en liste, et fait une itération de celle-ci :

    with open('/usr/share/dict/french', 'r', 100) as f: 
        for line in list(f) :
            print(line, end="")
    

    … on peut même se passer de list(), python se charge de la transformation si il voit une boucle.

    La doc de python est touffue, très touffue, pour ne pas dire barbue; heureusement que son tutoriel l'est moins.

    • [^] # Re: A tatons

      Posté par . Évalué à 1 (+0/-0).

      Salut,

      Grand merci pour ton aide et tes explications.
      C'est quand même nettement plus agréable à lire que le commentaire de notre cher fanto qui méprise les gens qui ne comprennent pas.

      Merci également à guitou.

    • [^] # Re: A tatons

      Posté par . Évalué à 1 (+0/-0). Dernière modification le 08/01/20 à 19:42.

      En fait, même pas besoin de transformer en list, puisqu'en itérant sur f, c'est suffisant, le for passera par la méthode __iter__ de f.

  • # Solution simple et rapide.

    Posté par . Évalué à 1 (+0/-0).

    Pour répondre à ta question pour tester si le fichier est vide ou pas. C'est relativement simple.

        def testing_function():
            with open("open_file.txt", "r") as read_output:
                if(read_output.read() == ''):
                    sys.exit("File empty, exit.")

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.