Python3 best way to read unknown multi line input
Asked Answered
D

2

6

What is the best way in Python 3 to read in multi-line user input when the amount of input is unknown? The multi-line input will be separated by Enter

when I try using

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

I receive an EOFError

Then if I change it to a try-catch block

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

I still get the EOFError.

Dynast answered 5/10, 2017 at 18:24 Comment(9)
That's logical, since the error does not occur at printing, but at input(). So that should be in the try.Artemas
Are you piping data in from stdin? I've never seen an EOFError from calling input but I suppose it's possible.Koa
@AdamSmith: yes, if you use Ctrl+D in most terminals, this is also seen as termining the stdin.Artemas
The dupe is one of the most concise, smartest answers out there.Ratiocination
@cᴏʟᴅsᴘᴇᴇᴅ the dupe does not answer the question. As specified in my title I ask specifically for Python 3. The dupe is for Python 2Dynast
@Dynast did you not see the part of the answer that addresses python3?Ratiocination
@cᴏʟᴅsᴘᴇᴇᴅ input versus raw_input is usedDynast
@Dynast That is for python3. What is your issue?Ratiocination
@cᴏʟᴅsᴘᴇᴇᴅ please remove the duplicate tag, this is persistent problem in StackOverflow as explained here: quora.com/…Dynast
A
10

The EOFError occurs when you call input(), not when you test it, nor when you print it. So that means you should put input() in a try clause:

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

That being said, if input reads from the standard input channel, you can use it as an iterable:

import sys

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

Since every line now ends with the new line character '\n', we can use end='' in the print function, to prevent print a new line twice (once from the string, once from the print function).

I think the last version is more elegant, since it almost syntactically says that you iterate over the stdin and processes the lines individually.

Artemas answered 5/10, 2017 at 18:29 Comment(2)
But the last line might cause problems, won't it? Mimicking input() exactly might be subtleConfrere
@Elazar: based on the documentation of input, it reads from the stdin, strips the new line, and returns that. And raises an EOFError in case it has an EOF char. This is afaik the same what the iterator protocol over a stdin does (except that it terminates the loop in case of an EOF, and that it does not strip the new line).Artemas
S
0

Break the loop if input is blank,

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

produces,

3

3

[Program finished]

If you know the range,

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

produces,

3
4
5
12

[Program finished] 
Symbology answered 6/3, 2021 at 0:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.