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

Раздел: Основы Python -> Файловый ввод-вывод

Основы получения ввода в Python

Основной способ получить ввод от пользователя в консоли - функция input(). Она приостанавливает выполнение программы и ожидает, пока пользователь введёт строку и нажмёт Enter. Возвращается строка (тип str), даже если введены только цифры. Пример:

name = input()
print(f"Привет, {name}!")

ввод программ на python (ввод данных в программе python)

Алексей
Привет, Алексей!

Python file io (ввод-вывод файлов в python)

Если нужно вывести подсказку, передаётся строка-приглашение: input("Введите имя: ").

Функция input() удобна для простых диалоговых скриптов, но требует внимания при работе с числами и множественными значениями.

Как получить целое или дробное число?

Строку, возвращаемую input(), необходимо преобразовать к нужному типу явно. Для целых чисел используется int(), для вещественных - float(). Если пользователь введёт нечисловые символы, возникнет ошибка ValueError.

age_str = input("Сколько вам лет? ")
age = int(age_str)
print("Через год будет", age + 1)

Python temp files (временные файлы в python)

Лучше оборачивать преобразование в блок try/except для повторного запроса при неверном вводе:

while True:
    try:
        number = int(input("Введите целое число: "))
        break
    except ValueError:
        print("Ошибка! Введите именно целое число.")

Python index files (индексация файлов в python)

Типичные ошибки:

  • ValueError: invalid literal for int() with base 10 - пользователь ввёл буквы или символы, не являющиеся цифрами.
  • Пробельные символы вокруг числа (например, " 42 ") - int() их игнорирует, но если строка содержит посторонние символы после числа, ошибка.
  • Ввод с плавающей точкой в int() - дробные числа не подходят, требуется float().

Как прочитать несколько значений, разделённых пробелами?

Метод .split() разбивает строку по пробелам (или другому разделителю) на список строк. Затем можно преобразовать каждый элемент с помощью map().

data = input("Введите два числа через пробел: ").split()
a, b = map(int, data)
print(f"Сумма: {a + b}")

File python class (класс для работы с файлами в python)

Введите два числа через пробел: 10 20
Сумма: 30

Python file utf 8 (кодировка utf-8 для файлов в python)

Если разделитель не пробел, используйте .split(','. Проблемы: неверное количество элементов при распаковке (ValueError: too many values to unpack) - используйте len() проверку.

Как получить пароль, не показывая символы на экране?

Модуль getpass предоставляет функцию getpass.getpass(), которая запрашивает ввод без эха. Возвращается строка.

import getpass
password = getpass.getpass("Введите пароль: ")
print("Пароль принят" if password == "secret" else "Неверный пароль")

Python config files (конфигурационные файлы в python)

В некоторых средах разработки (например, PyCharm, IDLE) getpass может не скрывать ввод или вызывать RuntimeError. Рекомендуется тестировать в терминале ОС. Также функция не работает в интерактивных консолях Jupyter.

Как прочитать многострочный ввод до конца файла?

Для чтения всего ввода из консоли (или перенаправленного файла) удобно использовать sys.stdin.read(). Программа читает данные до EOF (Ctrl+D в Unix, Ctrl+Z в Windows).

import sys
text = sys.stdin.read()
print("Вы ввели:", repr(text))

Python copy file (копирование файла в python)

Или построчно через for line in sys.stdin: - цикл завершится при EOF.

Если ввод с клавиатуры в интерактивном режиме, после ввода данных необходимо подать сигнал EOF. В Windows - Ctrl+Z, затем Enter; в Linux - Ctrl+D. При случайном нажатии программа может зависнуть.

Как установить таймаут для ввода?

Стандартная функция input() не поддерживает таймаут. На Unix можно использовать модуль select для неблокирующего чтения sys.stdin. На Windows потребуется модуль threading.

Пример для Unix (Linux/macOS):

import sys, select, time
print("У вас 5 секунд на ввод:")
timeout = 5
rlist, _, _ = select.select([sys.stdin], [], [], timeout)
if rlist:
    answer = sys.stdin.readline().strip()
    print(f"Вы ввели: {answer}")
else:
    print("Время истекло")

Данный код блокирует выполнение не более 5 секунд.

Метод не портабелен - на Windows select работает только с сокетами. Для кроссплатформенности можно запустить поток, который читает ввод, а основной поток ожидает через time.sleep и проверяет флаг.

- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)
- Python open file read (открытие файла для чтения в python)

Расширенные примеры получения ввода

Пример 1: Функция безопасного ввода целого числа с проверкой диапазона
Пример
def safe_int_input(prompt, min_val=None, max_val=None):
    while True:
        try:
            value = int(input(prompt))
            if min_val is not None and value < min_val:
                print(f"Значение должно быть не меньше {min_val}.")
                continue
            if max_val is not None and value > max_val:
                print(f"Значение должно быть не больше {max_val}.")
                continue
            return value
        except ValueError:
            print("Ошибка: введите целое число.")

age = safe_int_input("Ваш возраст (0-150): ", 0, 150)
print(f"Возраст: {age}")
Ваш возраст (0-150): abc
Ошибка: введите целое число.
Ваш возраст (0-150): 200
Значение должно быть не больше 150.
Ваш возраст (0-150): 25
Возраст: 25
Пример 2: Чтение табличных данных из stdin (CSV)
Пример
import sys, csv
reader = csv.reader(sys.stdin)
for row in reader:
    print(' | '.join(row))
Если перенаправить файл data.csv в программу:
$ python script.py < data.csv
foo | bar | 123
baz | qux | 456
Пример 3: Ввод с автодополнением (модуль readline)
Пример
import readline

choices = ['help', 'exit', 'list', 'show']
def completer(text, state):
    options = [c for c in choices if c.startswith(text)]
    if state < len(options):
        return options[state]
    else:
        return None

readline.set_completer(completer)
readline.parse_and_bind("tab: complete")

command = input("Команда: ")
print(f"Выбрана команда: {command}")
При нажатии Tab после набора 'h' подставится 'help'.
Пример 4: Ввод пароля с маскировкой звёздочками (без getpass)
Пример
import sys, termios, tty
def get_password(prompt="Password: "):
    print(prompt, end='', flush=True)
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        password = ''
        while True:
            ch = sys.stdin.read(1)
            if ch in ('\r', '\n'):
                break
            elif ch == '\x7f':  # backspace
                if password:
                    password = password[:-1]
                    sys.stdout.write('\b \b')
            else:
                password += ch
                sys.stdout.write('*')
            sys.stdout.flush()
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    print()
    return password

pwd = get_password()
print(f"Длина пароля: {len(pwd)}")
Password: ****

Примечание:

Пример 4 работает только на Unix-системах. Для кроссплатформенности лучше использовать getpass, но данный пример демонстрирует низкоуровневую работу с терминалом.

Получение ввода в Python - comments

En
Python get input (python)