【问题标题】:Python3 best way to read unknown multi line inputPython3读取未知多行输入的最佳方法
【发布时间】:2018-03-17 11:24:37
【问题描述】:

当输入量未知时,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。

【问题讨论】:

  • 这是合乎逻辑的,因为错误不会在打印时发生,而是在input()。所以应该在try
  • 您是从标准输入管道输入数据吗?我从未见过调用 input 时出现 EOFError,但我想这是可能的。
  • @AdamSmith:是的,如果您在大多数终端中使用Ctrl+D,这也被视为终止标准输入。
  • 骗子是目前最简洁、最聪明的答案之一。
  • @cᴏʟᴅsᴘᴇᴇᴅ 骗子没有回答问题。正如我的标题中指定的那样,我专门针对 Python 3 提出要求。欺骗是针对 Python 2

标签: python python-3.x input user-input eof


【解决方案1】:

EOFError 在您调用input() 时出现,而不是在您测试它时,也不是在您打印它时。所以这意味着您应该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='' 来防止两次打印新行(一次来自字符串,一次来自@987654333 @函数)。

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

【讨论】:

  • 但是最后一行可能会导致问题,不是吗?完全模仿input() 可能很微妙
  • @Elazar:基于输入的documentation,它从标准输入读取,删除新行,然后返回。并引发EOFError,以防它有一个EOF char。这与 stdin 上的迭代器协议所做的相同(除了它在 EOF 的情况下终止循环,并且它不会剥离新行)。
【解决方案2】:

如果输入为空则中断循环,

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] 

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多