How to read multiple lines of raw input?

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?

70780 次浏览

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
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))

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

import sys
s = sys.stdin.read()
print(s)

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)

Try this

import sys


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


print(lines)

INPUT:

1

2

3

4

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

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

*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.

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.

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

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.

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 ❯

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}')

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

while data := input():
print("line", data)
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)))

Simple, do

lst = [x for x in input("Enter numbers seperated by spaces").split("\n")]
line = input("Please enter lines: ")
lines = ""
while line:
lines += "\n" + line
line = input()
print(lines)