Reputation: 17478
I want to do something like:
for line in sys.stdin:
do_something()
if is **END OF StdIn**:
do_something_special()
After a few tries, for now I am doing this:
while True:
try:
line = sys.stdin.next()
print line,
except StopIteration:
print 'EOF!'
break
Or with this:
while True:
line = sys.stdin.readline()
if not line:
print 'EOF!'
break
print line,
I think both above ways are very similar. I want to know is there a more elegant (pythonic) way to do this?
I first tried to catch the StopIteration
from inside or outside of a for
loop, but I soon realize that since the StopIteration
exception is build into for
loop itself, both following code snippet didn't work.
try:
for line in sys.stdin:
print line,
except StopIteration:
print 'EOF'
or
for line in sys.stdin:
try:
print line,
except StopIteration:
print 'EOF'
Upvotes: 19
Views: 46310
Reputation: 4253
Use an iterator
from typing import Iterable
def last_line(itr: Iterable[str]) -> (bool, str):
last = None
for line in itr:
if last is not None:
yield False, last
last = line
if last is not None:
yield True, last
like this
for last, line in last_line(sys.stdin):
if not last:
do_something()
else:
do_something_special()
Upvotes: 0
Reputation: 2024
Use try/except. Input
When EOF is read, EOFError is raised.
while True:
try:
s=input("> ")
except EOFError:
print("EOF")
break
Upvotes: 15
Reputation: 280963
for line in sys.stdin:
do_whatever()
# End of stream!
do_whatever_else()
It's that simple.
Upvotes: 32