Как принимать ввод от пользователя в скриптах 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 и проверяет флаг.
Расширенные примеры получения ввода
Пример 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, но данный пример демонстрирует низкоуровневую работу с терминалом.