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

在python中,如何检查标准输入流(sys.stdin)的结尾并对其执行特殊操作,python,stdin,eof,Python,Stdin,Eof,我想做一些类似的事情: for line in sys.stdin: do_something() if is **END OF StdIn**: do_something_special() 经过几次尝试,目前我正在这样做: while True: try: line = sys.stdin.next() print line, except StopIteration: print 'EOF!'

我想做一些类似的事情:

for line in sys.stdin:
    do_something()
    if is **END OF StdIn**:
        do_something_special()
经过几次尝试,目前我正在这样做:

while True:
    try:
        line = sys.stdin.next()
        print line,
    except StopIteration:
        print 'EOF!'
        break
或者用这个:

while True:
    line = sys.stdin.readline()
    if not line:
        print 'EOF!'
        break
    print line,
我认为以上两种方式非常相似。我想知道有没有一种更优雅的方法来做到这一点


早期失败的尝试: 我第一次尝试从
for
循环的内部或外部捕获
StopIteration
,但我很快意识到,由于
StopIteration
异常是内置于
for
循环本身,以下两个代码片段都不起作用

try:
    for line in sys.stdin:
        print line,
except StopIteration:
    print 'EOF'

就这么简单。

使用try/except

读取EOF时,EOFError升高

while True:
    try:
        s=input("> ")
    except EOFError:
        print("EOF")
        break

你找到你问题的答案了吗?我在2.7中面临同样的问题。应该有一个简单的解决方案;循环体不会在点击“回车”后立即启动,这是没有用的。但是,该代码在Python 3中的工作方式与预期相同。@Codism:这听起来像是输入缓冲,无论是在文件对象实现中还是在操作系统级别。这很正常。如果您想要不同的缓冲行为,有很多方法可以实现,但这不是这个问题的主题。如果输入没有换行结束,这将永远挂起。@meawoppl:只要输入流实际结束(而不是保持打开),循环就应该终止。如果您是从终端运行此命令,则可能需要按Ctrl-D或其他命令来表示输入结束。@user2357112请添加注释这仅适用于Python 3
for line in sys.stdin:
    do_whatever()
# End of stream!
do_whatever_else()
while True:
    try:
        s=input("> ")
    except EOFError:
        print("EOF")
        break