web-dev-qa-db-fra.com

Quelle est la contrepartie parfaite dans Python pour "tant que pas EOF"

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

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

Ainsi, je me demande comment puis-je faire cela simple et rapide en Python?

98
Allen Koo

Boucle sur le fichier pour lire les lignes:

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

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

Vous pouvez faire la même chose avec le stdin (inutile d'utiliser raw_input():

import sys

for line in sys.stdin:
    do_something()

Pour compléter l’image, des 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 du fichier et l'itération s'arrêtera lorsque openfileobject.read(1024) commencera à renvoyer des chaînes d'octets vides.

169
Martijn Pieters

Vous pouvez imiter le langage C en Python.

Pour lire une mémoire tampon jusqu'à max_size _ nombre d'octets, vous pouvez procéder comme suit:

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

Ou, 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 la construction while True / break car il y a no eof test dans Python _ autre que le manque d'octets renvoyés à partir d'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 ceci en Python:

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

car les assignations ne sont pas autorisées dans les expressions en Python.

Il est certainement plus idiomatique dans Python pour ce faire:

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

Le langage Python permettant d'ouvrir un fichier et de le lire ligne par ligne est le suivant:

with open('filename') as f:
    for line in f:
        do_something(line)

Le fichier sera automatiquement fermé à la fin du code ci-dessus (la construction with s'en occupe).

Enfin, il convient de noter que line préservera la nouvelle ligne. Ceci peut être facilement enlevé en utilisant:

line = line.rstrip()
16
NPE

Bien qu'il y ait des suggestions ci-dessus pour "faire le python manière" ", si on veut vraiment avoir une logique basée sur EOF, alors je suppose que la gestion des exceptions est le moyen 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 ...

Exemple:

$ 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 à l'invite raw_input() (Windows, Ctrl-Z Linux)

10
user5472996

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()
10
A R

Vous pouvez utiliser l'extrait de code suivant. readlines () lit tout le fichier à la fois et le scinde par ligne.

line = obj.readlines()
1
Aditeya Pandey