Как мне прочитать несколько строк необработанного ввода в Python?
Я хочу создать программу на Python, которая принимает несколько строк пользовательского ввода. Например:
This is a multilined input.
It has multiple sentences.
Each sentence is on a newline.
Как я могу взять несколько строк необработанного ввода?
17 ответов
sentinel = '' # ends when this string is seen
for line in iter(raw_input, sentinel):
pass # do things here
Чтобы получить каждую строку в виде строки, вы можете сделать:
'\n'.join(iter(raw_input, sentinel))
Python 3:
'\n'.join(iter(input, sentinel))
В качестве альтернативы, вы можете попробовать sys.stdin.read()
import sys
s = sys.stdin.read()
print(s)
Продолжайте читать строки, пока пользователь не введет пустую строку (или не изменится stopword
к чему-то еще)
text = ""
stopword = ""
while True:
line = raw_input()
if line.strip() == stopword:
break
text += "%s\n" % line
print text
Попробуй это
import sys
lines = sys.stdin.read().splitlines()
print(lines)
ВХОД:
1
2
3
4
ВЫХОД:['1', '2', '3', '4']
Просто расширив этот ответ /questions/11298365/kak-mne-prochitat-neskolko-strok-neobrabotannogo-vvoda-v-python/11298385#11298385 вместо любого стоп-слова, вы можете просто проверить, есть ли строка или нет
content = []
while True:
line = raw_input()
if line:
content.append(line)
else:
break
Вы получите строки в списке, а затем присоединитесь к \n, чтобы перейти в ваш формат.
print '\n'.join(content)
* Я долго боролся с этим вопросом, потому что хотел найти способ прочитать несколько строк пользовательского ввода без необходимости прерывать его с помощью Control D (или стоп-слова). В конце концов я нашел способ в Python3, используя модуль pyperclip (который вы должны будете установить с помощью установки pip). Ниже приведен пример, который принимает список IP-адресов *
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
Для меня это именно то, что я искал; возьмите несколько строк ввода, выполните необходимые действия (здесь простая печать), а затем прервите цикл при обработке последней строки. Надеюсь, это может быть одинаково полезно и для вас.
В Python 3 вы можете присвоить каждой строке
data
:
while data := input():
print("line", data)
Самый простой способ прочитать несколько строк из командной строки / консоли, когда вы знаете точное количество строк, которые должен читать ваш питон, - это понимание списка.
lists = [ input() for i in range(2)]
Приведенный выше код читается в 2 строки. И сохраните входы в списке.
sys.stdin.read() может использоваться для получения многострочного ввода от пользователя. Например
>>> 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
Это лучший способ написать код в версии python >3.5
a= int(input())
if a:
list1.append(a)
else:
break
даже если вы хотите установить ограничение на количество значений, которые вы можете использовать
while s>0:
a= int(input())
if a:
list1.append(a)
else:
break
s=s-1
Набор инструментов Python Prompt на самом деле является отличным ответом, но приведенный выше пример на самом деле этого не показывает. Лучшим примером является get-multiline-input.py из каталога примеров:
#!/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)
Используя этот код, вы получаете многострочный ввод, в котором каждую строку можно редактировать даже после ввода последующих строк. Также есть несколько приятных дополнительных функций, таких как номера строк. Ввод завершается нажатием клавиши escape, а затем клавиши ввода:
~ / Desktop ❯ py prompt.py
Нажмите [Meta+Enter] или [Esc], а затем [Enter], чтобы принять ввод.
Многострочный ввод: первая строка текста, затем ввод
- 2 - вторая строка текста, затем ввод
- 3 - третья строка текста, клавиши со стрелками работают для перемещения, ввод
- 4 - и строки можно редактировать по желанию, пока вы
- 5 - нажмите клавишу выхода, а затем клавишу ввода.
Вы сказали: первая строка текста, затем введите
вторую строку текста, затем введите
третью строку текста, клавиши со стрелками работают для перемещения, ввод
и строки можно редактировать по желанию, пока вы
нажимаете клавишу выхода, а затем клавишу ввода
~ / Рабочий стол ❯
Как вам это нравится? Я имитировал телнет. Фрагмент очень понятен :)
#!/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}')
line = input("Please enter lines: ")
lines = ""
while line:
lines += "\n" + line
line = input()
print(lines)
Я разработал эту функцию много лет назад, и с тех пор она без каких-либо проблем служит своей цели. Он далеко не самый элегантный, самый эффективный или самый быстрый и, конечно же, не реализует лучшие практики Python. Но это простой алгоритм, который можно было бы легче перевести на другие языки, поэтому существуют очевидные возможности для улучшения и оптимизации. Я даже не собирался публиковать это здесь, но подумал, что кому-то это может быть полезно в качестве отправной точки.
Питон 3
def multiline(
message: str,
safetyKeyword: list|str,
show_safetyKeyword: bool = False,
display_multiline_tag: bool = True,
show_prompt: bool = True
):
# message : str
# Message to be displayed when asking the user for input
# safetyKeyword : list[str] | str
# String (or list of strings) that will break the loop
# show_safetyKeyword : bool
# Determines if the message displayed to the user will contain the list of safety keywords or not
# display_multiline_tag : bool
# Determines whether to display the [ML] tag on every line
# show_prompt : bool
# Flag that controls whether to display the prompt at all.
#
# @return str
#
# Usage:
# >>> text = multiline("Describe how are you felling today.", "--end :)", True)
#
# *** Multiline Interaction - [*nix: Ctrl-D, Windows: Ctrl-Z, to erase previous answer]
# *** Type one of these words to exit: ['--end :)']
# *** Describe how are you felling today.
# [ML] >> Hello
# [ML] >> This is a test for a multiline input function
# [ML] >> It has the ability to erase previous linws
# [ML] >> ^Z
# [ML] Removed: 'It has the ability to erase previous linws'
# [ML] >> It has the ability to erase previous lines*. Ops... :)
# [ML] >> Anyway
# [ML] >> Cheers
# [ML] >> --end :)
#
# >>> print(text)
# Hello
# This is a test for a multiline input function
# It has the ability to erase previous lines*. Ops... :)
# Anyway
# Cheers
# >>>
# The question needs to be a string to be printed to the user
if not isinstance(message, str):
raise TypeError("Message needs to be a string")
# This checks to see if the user provited a list of strings
# or just a single string. Then a list of strings is created
# to assure a list of strings (a good candidate for optimization)
if isinstance(safetyKeyword, list):
if not all([isinstance(item, str) and len(item) > 0 for item in safetyKeyword]):
raise TypeError("List of Safety Keywords must contain only non-empty strings")
safety = [kw.lower() for kw in safetyKeyword]
elif not isinstance(safetyKeyword, str):
raise TypeError("Safety Keyword needs to be at least a string")
else: safety = [safetyKeyword]
# We are not savages. Have at least one safety keyword
# otherwise a infinite loop might happen
if len(safety) < 1:
raise AssertionError("There must be at least one safety keyword")
# This branch sets up the tag that will be displayed
# before every line
if display_multiline_tag: inline_prompt = '[ML] >> '
else: inline_prompt = ''
lines = [] # Container for the text
answer = None # Each line the user inputs
if show_prompt:
print("*** Multiline Interaction - [*nix: Ctrl-D, Windows: Ctrl-Z, to erase previous answer]")
if show_safetyKeyword:
print("*** Type one of these options to exit:", str(safety)[1:-1])
print(message)
# Keep a loop running until the user types a safety keyword
# In that case, the user wants to finish the text
# So wraps everything up, and returns the text to the user
while answer not in safety:
try:
# Ask the user's input
# input() function provides the functionality
# of throwing exception uppon encountering EOF
answer = input(inline_prompt)
# No erase exception thrown so just store the inserted line
lines.append(answer)
except EOFError: # User pressed Ctrl-D / Ctrl-Z
# It'll only try to erase the last line if there is a last line in the first place
if len(lines) > 0:
popped = lines.pop()
# Do something with the removed item, if you want
# in this case, just print back what was erased
# and go back asking for input again
print(inline_prompt, 'Removed:', repr(popped))
# Returns almost all lines combined with a separation character
# in this case, a new-line character, could be any character you want :)
# The last item in the list will allways be the safety keyword
return '\n'.join(lines[:-1])
Более чистый способ (без взлома стоп-слов или CTRL+D) - использовать Python Prompt Toolkit.
Затем мы можем сделать:
from prompt_toolkit import prompt
if __name__ == '__main__':
answer = prompt('Paste your huge long input: ')
print('You said: %s' % answer)
Обработка ввода довольно эффективна даже при использовании длинных многострочных вводов.
Просто, делай
lst = [x for x in input("Enter numbers seperated by spaces").split("\n")]
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)))