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.
Martijn Pieters
la source
line
aura un nouveau caractère de ligne à la fin.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:Ou, un fichier texte ligne par ligne:
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:
Cependant, vous ne pouvez pas avoir cela en Python:
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:
Mise à jour: depuis Python 3.8, vous pouvez également utiliser des expressions d'affectation :
la source
readline()
méthode non idiomatique : vous pouvez effectuer une gestion des erreurs fine, comme la captureUnicodeDecodeError
, 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:
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:la source
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
la source
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 -
Exemple:
Ou appuyez sur Ctrl-Zà une
raw_input()
invite (Windows, Ctrl-ZLinux)la source
Vous pouvez utiliser l'extrait de code suivant. readlines () lit le fichier entier à la fois et le divise par ligne.
la source
En plus de la bonne réponse de @ dawg, la solution équivalente utilisant l'opérateur morse (Python> = 3,8):
la source