Je viens de tomber sur ce morceau de code
while 1:
line = data.readline()
if not line:
break
#...
et pensé, il doit être une meilleure façon de le faire, que d'utiliser une boucle infinie avec break
.
J'ai donc essayé:
while line = data.readline():
#...
et, évidemment, a obtenu une erreur.
Existe-t-il un moyen d'éviter d'utiliser un break
dans cette situation?
Idéalement, vous voudriez éviter de dire readline
deux fois ... À mon humble avis, la répétition est encore pire qu'un simple break
, surtout si l'instruction est complexe.
Si vous ne faites rien de plus sophistiqué avec les données, comme lire plus de lignes plus tard, il y a toujours:
for line in data:
... do stuff ...
Essayez celui-ci, fonctionne pour les fichiers ouverts avec open('filename')
for line in iter(data.readline, b''):
Ce n'est pas beaucoup mieux, mais c'est comme ça que je le fais d'habitude. Python ne renvoie pas la valeur lors de l'affectation de variable comme les autres langages (par exemple, Java).
line = data.readline()
while line:
# ... do stuff ...
line = data.readline()
Comme,
for line in data:
# ...
? Il dépend de la sémantique de la sémantique de ligne de lecture de l'objet data
. Si data
est un objet file
, cela fonctionnera.
for line in data:
... process line somehow....
Itérera sur chaque ligne du file
, plutôt que d'utiliser un while
. C'est un idiome beaucoup plus courant pour la tâche de lecture d'un fichier d'après mon expérience (en Python).
En fait, data
ne doit pas nécessairement être un fichier mais simplement fournir un itérateur.
Si data
est un fichier, comme indiqué dans d'autres réponses, en utilisant for line in file
fonctionnera bien. Si les données ne sont pas un fichier et un objet de lecture de données aléatoire, vous devez l'implémenter en tant qu'itérateur, implémentant __iter__
et next
méthodes.
La méthode next
doit à la lecture, vérifier s'il y a plus de données, et sinon, augmenter StopIteration
. Si vous procédez ainsi, vous pouvez continuer à utiliser le for line in data
idiome.
Selon la FAQ de la documentation de Python, itérer sur l'entrée avec la construction for
ou exécuter une infinie while True
loop et l'utilisation de l'instruction break
pour y mettre fin, sont des modes d'itération préférés et idiomatiques.
En démarrant Python 3.8
Et en introduisant expressions d'affectation (PEP 572) (opérateur :=
), Il est maintenant possible de capturer la valeur de la condition (data.readline()
) de la boucle while en tant que variable (line
) afin de la réutiliser dans le corps de la boucle:
while line := data.readline():
do_smthg(line)
Vous pourriez faire:
line = 1
while line:
line = data.readline()
Si data
a une fonction qui retourne un itérateur au lieu de readline
(disons data.iterate
), vous pouvez simplement faire:
for line in data.iterate():
#...