在python中,如何检查标准输入流(sys.stdin)的结束并对其执行特殊操作

YaO*_*OzI 12 python stdin eof

我想做的事情如下:

for line in sys.stdin:
    do_something()
    if is **END OF StdIn**:
        do_something_special()
Run Code Online (Sandbox Code Playgroud)

经过几次尝试,现在我这样做:

while True:
    try:
        line = sys.stdin.next()
        print line,
    except StopIteration:
        print 'EOF!'
        break
Run Code Online (Sandbox Code Playgroud)

或者用这个:

while True:
    line = sys.stdin.readline()
    if not line:
        print 'EOF!'
        break
    print line,
Run Code Online (Sandbox Code Playgroud)

我认为以上两种方式非常相似.我想知道有更优雅(pythonic)的方式吗?


早期尝试失败:

我首先尝试StopIterationfor循环内部或外部捕获,但我很快意识到,由于StopIteration异常是构建到 for循环本身,所以下面的代码片段都不起作用.

try:
    for line in sys.stdin:
        print line,
except StopIteration:
    print 'EOF'
Run Code Online (Sandbox Code Playgroud)

要么

for line in sys.stdin:
    try:
        print line,
    except StopIteration:
        print 'EOF'
Run Code Online (Sandbox Code Playgroud)

use*_*ica 16

for line in sys.stdin:
    do_whatever()
# End of stream!
do_whatever_else()
Run Code Online (Sandbox Code Playgroud)

就这么简单.

  • @meawoppl:[无法重现.](https://ideone.com/Gf9FZL)只要输入流实际结束(而不是仅仅保持打开状态),循环就应该终止.如果您从终端运行此命令,则可能必须按Ctrl-D或其他信号来表示输入结束. (2认同)

KIM*_*oon 8

使用try/except.输入

读取EOF时,会引发EOFError.

while True:
    try:
        s=input("> ")
    except EOFError:
        print("EOF")
        break
Run Code Online (Sandbox Code Playgroud)