144 votes

Quel est l'équivalent parfait en Python de " while not EOF " ?

Pour lire un fichier texte, en C ou Pascal, j'utilise toujours les snippets suivants pour lire les données jusqu'à EOF :

while not eof do begin
  readline(a);
  do_something;
end;

Ainsi, je me demande comment faire cela de manière simple et rapide en Python ?

229voto

Martijn Pieters Points 271458

Boucle sur le fichier pour lire les lignes :

with open('somefile') as openfileobject:
    for line in openfileobject:
        do_something()

Les objets fichiers sont itérables et produisent des lignes jusqu'à EOF. L'utilisation de l'objet fichier en tant qu'itérable utilise un tampon pour assurer des lectures performantes.

Vous pouvez faire de même avec le stdin (pas besoin d'utiliser raw_input() :

import sys

for line in sys.stdin:
    do_something()

Pour compléter le tableau, les lectures binaires peuvent être effectuées avec :

from functools import partial

with open('somefile', 'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read, 1024), b''):
        do_something()

chunk contiendra jusqu'à 1024 octets à la fois à partir du fichier, et l'itération s'arrête quand openfileobject.read(1024) commence à retourner des chaînes d'octets vides.

74voto

dawg Points 26051

Vous pouvez imiter l'idiome C en Python.

Pour lire un tampon jusqu'à max_size nombre d'octets, vous pouvez le faire :

with open(filename, 'rb') as f:
    while True:
        buf = f.read(max_size)
        if not buf:
            break
        process(buf)

Ou encore, un fichier texte ligne par ligne :

# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
    while True:
        line = f.readline()
        if not line:
            break
        process(line)

Vous devez utiliser while True / break construire puisqu'il y a pas de test eof en Python autre que le manque d'octets retournés par une lecture.

En C, vous pourriez avoir :

while ((ch != '\n') && (ch != EOF)) {
   // read the next ch and add to a buffer
   // ..
}

Cependant, vous ne pouvez pas avoir cela en Python :

 while (line = f.readline()):
     # syntax error

parce que les affectations ne sont pas autorisées dans les expressions en Python (bien que les versions récentes de Python puissent imiter cela en utilisant des expressions d'affectation, voir ci-dessous).

C'est certainement plus idiomatique en Python pour faire cela :

# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
    for line in f:
        process(line)

Mise à jour : Depuis Python 3.8, vous pouvez également utiliser expressions d'affectation :

 while line := f.readline():
     process(line)

Cela fonctionne même si la ligne lue est vide et continue jusqu'à EOF.

14voto

user2599593 Points 138

Vous pouvez utiliser l'extrait de code ci-dessous pour lire ligne par ligne, jusqu'à la fin du fichier.

line = obj.readline()
while(line != ''):

    # Do Something

    line = obj.readline()

13voto

user5472996 Points 131

Bien qu'il y ait des suggestions ci-dessus pour "le faire à la manière de python", si l'on veut vraiment avoir une logique basée sur EOF, alors je suppose que l'utilisation de la gestion des exceptions est la façon de le faire

try:
    line = raw_input()
    ... whatever needs to be done incase of no EOF ...
except EOFError:
    ... whatever needs to be done incase of EOF ...

Ejemplo:

$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
  File "<string>", line 1, in <module> 
EOFError: EOF when reading a line

Ou appuyez sur Ctrl-Z à un raw_input() (Windows, Ctrl-Z Linux)

3voto

Infinity Points 1674

En plus de l'excellente réponse de @dawg, la solution équivalente utilisant l'opérateur morse (Python >= 3.8) :

with open(filename, 'rb') as f:
    while buf := f.read(max_size):
        process(buf)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X