Python3读取未知多行输入的最佳方法

6
什么是Python 3中处理未知数量多行用户输入的最佳方式?多行输入将由回车符分隔。
当我尝试使用以下代码时:
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 中。 - Willem Van Onsem
@AdamSmith:是的,如果你在大多数终端中使用Ctrl+D,这也被视为终止stdin。 - Willem Van Onsem
这个答案是最简洁、最聪明的答案之一。 - cs95
@Mazzone,你没有看到回答中提到的关于Python3的部分吗? - cs95
@Mazzone 这是针对Python3的。你有什么问题? - cs95
显示剩余4条评论
2个回答

10
当你调用input()时,会出现EOFError,而不是在测试或打印它时。这意味着你应该将input()放在一个try语句中:
try:
    line = input()
    print(line)
except EOFError:
    break

话虽如此,如果input从标准输入通道读取,您可以将其用作可迭代对象:

import sys

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

自从每个line现在都以新行字符'\n'结尾,我们可以在print函数中使用end=''来防止打印两次新行(一次来自字符串,一次来自print函数)。我认为最后一个版本更加优雅,因为它几乎在语法上表明您正在遍历stdin并逐个处理每行。

但是最后一行可能会引起问题,不是吗?完全模仿input()可能会很微妙。 - Elazar
@Elazar:根据input文档,它从stdin读取,去除换行符并返回。如果有EOF字符,则会引发EOFError。据我所知,这与在stdin上使用迭代器协议的操作相同(除了在EOF的情况下终止循环,并且不去除换行符)。 - Willem Van Onsem

0

如果输入为空,则跳出循环。

a = []
while True:
   user_input = input()
   if user_input == '':
     break
   else:
       a.append(int(user_input))
       
print(sum(a))

生成,

3

3

[Program finished]

如果您知道范围,

x, *z= [int(input()) for _ in range(3)]
print(x + sum(z))

生成,

3
4
5
12

[Program finished] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接