Многострочный пользовательский ввод в Python

Часто бывает необходимо получить от пользователя сразу несколько значений и сохранить их, например, в список. В этой статье мы рассмотрим два варианта чтения многострочного ввода: до введения пользователем стоп-слова или до прерывания ввода при помощи сочетания клавиш.

Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по Python.

Ввод пользователем нескольких строк

Чтобы получить многострочный пользовательский ввод:

  1. Используйте цикл while для итерации до тех пор, пока пользователь вводит значения.
  2. На каждой итерации добавляйте введенные пользователем значения и символ новой строки в список.
  3. Если пользователь нажимает Enter, не введя значения, выходите из цикла.
lines = []

while True:
    user_input = input()

    # 👇️ Если пользователь нажал Enter без ввода значения, прервать цикл
    if user_input == '':
        break
    else:
        lines.append(user_input + '\n')


# 👇️ prints list of strings
print(lines)

# 👇️ join list into a string
print(''.join(lines))
Запуск приведенного выше кода в консоли.

Мы использовали цикл while, работающий до тех пор, пока пользователь вводит значения.

На каждой итерации мы проверяем, не нажал ли пользователь Enter, не введя значения, чтобы выйти из цикла while True.

Условие выхода из цикла может быть любым. Например, вы можете использовать стоп-слово, такое как done или quit.

Оператор break прерывает цикл for или while.

Если пользователь вводит значение, мы используем метод list.append(), чтобы добавить это значение и символ новой строки в список.

Метод list.append() добавляет элемент в конец списка.

Чтение пользовательского ввода до EOF в Python

В качестве альтернативы можно использовать метод sys.stdin.readlines() для чтения пользовательского ввода до EOF.

EOF (аббревиатура англ. end of file — конец файла) в компьютерной терминологии является индикатором операционной системы, означающим, что данные в источнике закончились. Источниками данных обычно являются файлы и потоки.
Для указания терминалу в UNIX и Linux «EOF» следует воспользоваться комбинацией клавиш Ctrl+D. В Windows — Ctrl+Z.

Википедия

Метод readlines() вернет список, содержащий строки.

Пользователь может нажать CTRL + D (Unix) или CTRL + Z (Windows) для выхода.

import sys

# 👇️ Для выхода пользователь должен нажать Ctrl + D (Unix) или Ctrl + Z (Windows)

print('Press CTRL + D (Unix) or CTRL + Z (Windows) to exit')

user_input = sys.stdin.readlines()

# 👇️ Получить список строк
print(user_input)

# 👇️ Объединить элементы списка в строку
print(''.join(user_input))
Запуск приведенного выше кода в консоли

stdin используется для интерактивного пользовательского ввода.

Метод readlines() возвращает список, введенный пользователем.

Вы можете использовать метод str.join(), если вам нужно объединить список строк в одну строку.

# a
# b
# c
print(''.join(['a\n', 'b\n', 'c\n']))

Если вам нужна только строка, содержащая строки, используйте метод sys.stdin.read().

import sys


user_input = sys.stdin.read()

print(user_input)
Запуск приведенного выше кода в консоли

Метод sys.stdin.read() возвращает строку, содержащую строки, введенные пользователем.

В качестве альтернативы можно использовать оператор try/except.

Чтение пользовательского ввода до EOF с использованием try/except

Этот процесс состоит из трех шагов:

  1. Используйте цикл while для итерации до EOF.
  2. На каждой итерации добавляйте вводимые пользователем данные в список.
  3. Перехватите исключение EOFError в блоке except и выйдите из цикла.
lines = []


while True:
    try:
        lines.append(input())
    except EOFError:
        lines_str = '\n'.join(lines)
        print(lines_str)

        break

print(lines)
Запуск приведенного выше кода в консоли

Мы использовали цикл while для итерации до EOF.

Если пользователь нажмет CTRL + D (Unix) или CTRL + Z (Windows), возникнет исключение EOFError, которое будет обработано в блоке except.

Заключение

В этой статье мы рассмотрели, как принимать многострочный пользовательский ввод. Это делается в цикле, который либо прерывается пользователем при помощи сочетания клавиш, либо имеет определенное условие выхода (ввод какого-нибудь слова или ввод пустой строки).

Перевод статьи «Multiple lines user Input in Python».

Прокрутить вверх