Réponses:
Faites une boucle sur le fichier pour lire les lignes:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Les objets fichier sont itérables et produisent 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 (pas besoin 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()
où chunk
contiendra jusqu'à 1024 octets à la fois à partir du fichier, et l'itération s'arrête lorsque openfileobject.read(1024)
commence à renvoyer des chaînes d'octets vides.
stdin
d'un processus en cours d'exécution ... donc il n'a jamais EOF jusqu'à ce que je tue le processus. Mais ensuite, j'atteins la «fin jusqu'à maintenant» et je suis dans l'impasse. Comment puis-je détecter cela et non une impasse? Comme s'il n'y a pas de nouvelles lignes, arrêtez de lire les fichiers (même s'il n'y a pas d'EOF, qui dans mon cas n'existera jamais).
Vous pouvez imiter l'idiome C en Python.
Pour lire un tampon jusqu'à un 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, 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
construct car il n'y a pas de test eof en Python autre que le manque d'octets renvoyé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
car les affectations ne sont pas autorisées dans les expressions en Python (bien que les versions récentes de Python puissent imiter cela à l'aide d'expressions d'affectation, voir ci-dessous).
Il est certainement plus idiomatique en Python de 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 des expressions d'affectation :
while line := f.readline():
process(line)
readline()
méthode non idiomatique : vous pouvez effectuer une gestion des erreurs fine, comme la capture UnicodeDecodeError
, ce que vous ne pouvez pas faire avec l' for
itération idiomatique .
L'idiome Python pour ouvrir un fichier et le lire ligne par ligne est:
with open('filename') as f:
for line in f:
do_something(line)
Le fichier sera automatiquement fermé à la fin du code ci-dessus (la with
construction s'en charge).
Enfin, il convient de noter que line
cela conservera la nouvelle ligne de fin. Cela peut être facilement supprimé en utilisant:
line = line.rstrip()
for line in f.readlines(): ...
solution très similaire , couramment suggérée.
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()
Bien qu'il y ait des suggestions ci-dessus pour "le faire à la manière 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 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à une raw_input()
invite (Windows, Ctrl-ZLinux)
Vous pouvez utiliser l'extrait de code suivant. readlines () lit le fichier entier à la fois et le divise par ligne.
line = obj.readlines()
line
aura un nouveau caractère de ligne à la fin.