Reputation: 210455
I just came across this piece of code
while 1:
line = data.readline()
if not line:
break
#...
and thought, there must be a better way to do this, than using an infinite loop with break
.
So I tried:
while line = data.readline():
#...
and, obviously, got an error.
Is there any way to avoid using a break
in that situation?
Ideally, you'd want to avoid saying readline
twice... IMHO, repeating is even worse than just a break
, especially if the statement is complex.
Upvotes: 108
Views: 111402
Reputation: 61666
Starting Python 3.8
, and the introduction of assignment expressions (PEP 572) (:=
operator), it's now possible to capture the condition value (data.readline()
) of the while loop as a variable (line
) in order to re-use it within the body of the loop:
while line := data.readline():
do_smthg(line)
Upvotes: 155
Reputation: 1391
According to the FAQ from Python's documentation, iterating over the input with for
construct or running an infinite while True
loop and using break
statement to terminate it, are preferred and idiomatic ways of iteration.
Upvotes: 4
Reputation: 13289
This isn't much better, but this is the way I usually do it. Python doesn't return the value upon variable assignment like other languages (e.g., Java).
line = data.readline()
while line:
# ... do stuff ...
line = data.readline()
Upvotes: 21
Reputation: 451
Try this one, works for files opened with open('filename')
for line in iter(data.readline, b''):
Upvotes: 45
Reputation: 3932
If data
is a file, as stated in other answers, using for line in file
will work fine. If data is not a file, and a random data reading object, then you should implement it as an iterator, implementing __iter__
and next
methods.
The next
method should to the reading, check if there is more data, and if not, raise StopIteration
. If you do this, you can continue using the for line in data
idiom.
Upvotes: 3
Reputation: 6156
If data
has a function that returns an iterator instead of readline
(say data.iterate
), you could simply do:
for line in data.iterate():
#...
Upvotes: 2
Reputation: 375584
If you aren't doing anything fancier with data, like reading more lines later on, there's always:
for line in data:
... do stuff ...
Upvotes: 30
Reputation: 30947
Like,
for line in data:
# ...
? It large depends on the semantics of the data
object's readline semantics. If data
is a file
object, that'll work.
Upvotes: 7
Reputation: 31130
for line in data:
... process line somehow....
Will iterate over each line in the file
, rather than using a while
. It is a much more common idiom for the task of reading a file in my experience (in Python).
In fact, data
does not have to be a file but merely provide an iterator.
Upvotes: 5