2017-10-05 41 views
2

当输入量未知时,Python 3中读取多行用户输入的最佳方式是什么?多行输入将通过回车Python3读取未知多行输入的最佳方式

当我尝试使用

while True: 
    line = input() 
    if line: 
      print(line) 
    else: 
      break 

分离,收到的EOFError

然后,如果我其更改为try-catch块

while True: 
    line = input() 
    try: 
      print(line) 
    except EOFError: 
      break 

我仍然得到EOFError。

+2

这是合乎逻辑的,因为打印时不会发生错误,但是在input()处。所以这应该在'try'中。 –

+0

你是从标准输入管道输入数据吗?我从来没有看到EOFError调用'input',但我想这是可能的。 –

+0

@AdamSmith:是的,如果你在大多数终端中使用Ctrl + D,这也可以看作是stdin的终结。 –

回答

4

EOFError发生在您致电input()时,而不是当您测试它时,或打印它时。因此,这意味着你应该try条款input()

try: 
    line = input() 
    print(line) 
except EOFError: 
    break

话虽这么说,如果input从标准输入通道读取,你可以使用它作为一个迭代:

import sys 

for line in sys.stdin: 
    print(line, end='') 

由于每line现在以新行字符'\n'结束,我们可以在print函数中使用end='',以防止打印新行两次(一次来自字符串,一次来自print有趣ction)。

我认为最后一个版本更优雅,因为它几乎在语法上表示您遍历了stdin并单独处理这些行。

+0

但是最后一行可能会导致问题,不是吗?模仿'input()'确切可能是微妙的 – Elazar

+0

@Elazar:基于输入的[documentation](https://docs.python.org/3/library/functions.html#input),它从stdin读取,剥离新线,并返回。如果它有一个EOF字符,会引发一个'EOFError'。这与迭代器协议在stdin中的作用是一样的(除了它在EOF的情况下终止循环,并且它不剥除新行)。 –

相关问题