YaOzI
YaOzI

Reputation: 17478

In python, how to check the end of standard input streams (sys.stdin) and do something special on that

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?


Early failed tries:

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

Answers (3)

CervEd
CervEd

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

KIM Taegyoon
KIM Taegyoon

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

user2357112
user2357112

Reputation: 280963

for line in sys.stdin:
    do_whatever()
# End of stream!
do_whatever_else()

It's that simple.

Upvotes: 32

Related Questions