80

I want to create a Python program which takes in multiple lines of user input. For example:

This is a multilined input.
It has multiple sentences.
Each sentence is on a newline.

How can I take in multiple lines of raw input?

martineau
  • 112,593
  • 23
  • 157
  • 280
felix001
  • 13,941
  • 29
  • 86
  • 111

14 Answers14

112
sentinel = '' # ends when this string is seen
for line in iter(input, sentinel):
    pass # do things here

To get every line as a string you can do:

'\n'.join(iter(input, sentinel))

Python 2:

'\n'.join(iter(raw_input, sentinel))
jamylak
  • 120,885
  • 29
  • 225
  • 225
  • 14
    I've been a pythonista for about 6 years now and I never knew of this other form of `iter()`. You sir are a bl--dy genius! – inspectorG4dget Oct 12 '13 at 07:40
  • 7
    How do I set EOF as the sentinel character? – MadTux Jan 16 '14 at 15:42
  • @jamylak - does this not allow for a prompt in `raw_input`? Seems like you cannot pass parameters to the function in the first arg of `iter`. – Randy Jun 03 '14 at 20:34
  • 2
    @Randy You can it just won't look as pretty `iter(lambda: raw_input('prompt'), sentinel)` – jamylak Dec 21 '14 at 10:55
  • 2
    Note that in Python 3, `raw_input` is now `input`. – wecsam Sep 12 '16 at 20:39
  • 3
    @wecsam Added that in now to make answer complete for all pythons – jamylak Sep 13 '16 at 02:45
  • When I try printing my input with `for x in string_list: print(x)`, Python prints each individual character on its own line, rather than separating by newlines – Stevoisiak Nov 02 '17 at 15:40
  • try `for x in string_list.split('\n')` – jamylak Nov 05 '17 at 04:23
  • @StevenVascellaro you can serialize the iterator as a list rather than a string by letting `string_list = list(iter(input, sentinel))`. Iterating over this will give you the individual lines – wbadart Apr 10 '18 at 14:43
  • As a side note, if you want to include a prompt when taking input, you can use: `'\n'.join(iter(lambda: raw_input(), sentinel))`. – Christian Dean Mar 13 '19 at 02:10
18

Alternatively, you can try sys.stdin.read() that returns the whole input until EOF:

import sys
s = sys.stdin.read()
print(s)
Ctrl-C
  • 4,041
  • 1
  • 25
  • 29
Venkat
  • 331
  • 2
  • 9
  • 2
    This solution is perfect if you want to take in text that has multiple blank lines, or any other data. It stops when it hits EOF (Ctrl+D; Ctrl+Z on Windows). – Marko May 21 '20 at 16:10
7

Keep reading lines until the user enters an empty line (or change stopword to something else)

text = ""
stopword = ""
while True:
    line = raw_input()
    if line.strip() == stopword:
        break
    text += "%s\n" % line
print text
Junuxx
  • 13,645
  • 5
  • 40
  • 68
3

Just extending this answer https://stackoverflow.com/a/11664652/4476612 instead of any stop word you can just check whether a line is there or not

content = []
while True:
    line = raw_input()
    if line:
        content.append(line)
    else:
        break

you will get the lines in a list and then join with \n to get in your format.

print '\n'.join(content)
3

Try this

import sys

lines = sys.stdin.read().splitlines()

print(lines)

INPUT:

1

2

3

4

OUTPUT: ['1', '2', '3', '4']

OliverRadini
  • 5,753
  • 1
  • 17
  • 40
Arpitt Desai
  • 101
  • 1
  • 2
2

*I struggled with this question myself for such a long time, because I wanted to find a way to read multiple lines of user input without the user having to terminate it with Control D (or a stop word). In the end i found a way in Python3, using the pyperclip module (which you'll have to install using pip install) Following is an example that takes a list of IPs *

import pyperclip

lines = 0

while True:
    lines = lines + 1 #counts iterations of the while loop.

    text = pyperclip.paste()
    linecount = text.count('\n')+1 #counts lines in clipboard content.

    if lines <= linecount: # aslong as the while loop hasn't iterated as many times as there are lines in the clipboard.
        ipaddress = input()
        print(ipaddress)

    else:
        break

For me this does exactly what I was looking for; take multiple lines of input, do the actions that are needed (here a simple print) and then break the loop when the last line was handled. Hope it can be equally helpful to you too.

tinkerbits
  • 35
  • 5
1

The easiest way to read multiple lines from a prompt/console when you know exact number of lines you want your python to read, is list comprehension.

lists = [ input() for i in range(2)]

The code above reads 2 lines. And save inputs in a list.

KailiC
  • 111
  • 1
  • 10
0

sys.stdin.read() can be used to take multiline input from user. For example

>>> import sys
>>> data = sys.stdin.read()
  line one
  line two
  line three
  <<Ctrl+d>>
>>> for line in data.split(sep='\n'):
  print(line)

o/p:line one
    line two
    line three
0

Its the best way for writing the code in python >3.5 version

a= int(input())
if a:
    list1.append(a)
else:
    break

even if you want to put a limit for the number of values you can go like

while s>0:
a= int(input())
if a:
    list1.append(a)
else:
    break
s=s-1
lenz
  • 1,724
  • 12
  • 23
0

A more cleaner way (without stop word hack or CTRL+D) is to use Python Prompt Toolkit

We can then do:

from prompt_toolkit import prompt

if __name__ == '__main__':
    answer = prompt('Paste your huge long input: ')
    print('You said: %s' % answer)

It input handling is pretty efficient even with long multiline inputs.

Pratyush
  • 4,528
  • 5
  • 37
  • 59
0

The Python Prompt Toolkit is actually a great answer, but the example above doesn't really show it. A better example is get-multiline-input.py from the examples directory:

#!/usr/bin/env python
from prompt_toolkit import prompt
from prompt_toolkit.formatted_text import HTML


def prompt_continuation(width, line_number, wrap_count):
    """
    The continuation: display line numbers and '->' before soft wraps.
Notice that we can return any kind of formatted text from here.
The prompt continuation doesn't have to be the same width as the prompt
which is displayed before the first line, but in this example we choose to
align them. The `width` input that we receive here represents the width of
the prompt.
    """
    if wrap_count > 0:
        return " " * (width - 3) + "-> "
    else:
        text = ("- %i - " % (line_number + 1)).rjust(width)
        return HTML("<strong>%s</strong>") % text


if __name__ == "__main__":
    print("Press [Meta+Enter] or [Esc] followed by [Enter] to accept input.")
    answer = prompt(
    "Multiline input: ", multiline=True, prompt_continuation=prompt_continuation
)
    print("You said: %s" % answer)

Using this code you get multiline input in which each line can be edited even after subsequent lines are entered. There are some nice additional features, too, such as line numbers. The input is ended by hitting the escape key and then the enter key:

~/Desktop ❯ py prompt.py
Press [Meta+Enter] or [Esc] followed by [Enter] to accept input.
Multiline input: first line of text, then enter
- 2 - second line of text, then enter
- 3 - third line of text, arrow keys work to move around, enter
- 4 - and lines can be edited as desired, until you
- 5 - press the escape key and then the enter key
You said: first line of text, then enter
second line of text, then enter
third line of text, arrow keys work to move around, enter
and lines can be edited as desired, until you
press the escape key and then the enter key
~/Desktop ❯

bob
  • 21
  • 5
0

How do you like this? I mimicked telnet. The snippet is highly self-explanatory :)

#!/usr/bin/env python3

my_msg = input('Message? (End Message with <return>.<return>) \n>> ')

each_line = ''
while not each_line == '.':
    each_line = input('>> ')
    my_msg += f'\n{each_line}'

my_msg = my_msg[:-1]  # Remove unwanted period.

print(f'Your Message:\n{my_msg}')
yeiichi
  • 51
  • 4
0

With Python 3, you can assign each line to data:

while data := input():
    print("line", data)
Giovanni Cornachini
  • 121
  • 1
  • 2
  • 11
-1
def sentence_maker(phrase):
    return phrase

results = []
while True:
    user_input = input("What's on your mind: ")
    if user_input == '\end':
        break
    else:
        results.append(sentence_maker(user_input))

print('\n'.join(map(str, results)))
  • 1
    There are **13 existing answers** to this question, including a top-voted, accepted answer with over **one hundred votes**. Are you _certain_ your solution hasn't already been given? If not, why do you believe your approach improves upon the existing proposals, which have been validated by the community? Offering an explanation is _always_ useful on Stack Overflow, but it's _especially_ important where the question has been resolved to the satisfaction of both the OP and the community. Help readers out by explaining what your answer does different and when it might be preferred. – Jeremy Caney Mar 01 '22 at 00:45
  • Please read "[answer]". It helps more if you supply an explanation why this is the preferred solution and explain how it works. We want to educate, not just provide code. – the Tin Man Mar 11 '22 at 05:57