Получение пользовательского ввода в Python с input()
Получение и обработка информации — один из важнейших элементов любого языка программирования, особенно если речь идет о получении информации от пользователей.
Python, будучи медленным относительно таких языков, как C или Java, предлагает продвинутые инструменты для получения, анализа и обработки данных от конечного пользователя.
В этом материале речь пойдет о том, какие функции Python можно использовать для этих целей.
Ввод в Python
Для получения информации с клавиатуры в Python есть функции input() или raw_input() (о разнице между ними чуть позже). У них есть опциональный параметр prompt , который является выводимой строкой при вызове функции.
Когда input() или raw_input() вызываются, поток программы останавливается до тех пор, пока пользователь не введет данные через командную строку. Для ввода нужно нажать Enter после завершения набора текста. Обычно Enter добавляет символ новой строки ( \n ), но не в этом случае. Введенная строка просто будет передана приложению.
Интересно, что кое-что поменялось в принципе работе функции между Python 2 и Python 3, что отразилось в разнице между input() и raw_input() . Об этом дальше.
Сравнение функций input и raw_input
Разница между этими функциями зависит от версии Python. Так, в Python 2 функция raw_input() используется для получения ввода от пользователя через командную строку, а input() оценивает ее и попробует запустить как код Python.
В Python 3 от raw_input() избавились, оставив только input() . Она используется для получения ввода пользователя с клавиатуры. Возможности input() из Python 2 в Python 3 работать не будут. Для той же операции нужно использовать инструкцию eval(input()) .
Взгляните на пример функции raw_input в Python 2.
# Python 2 txt = raw_input("Введите что-нибудь, чтобы проверить это: ") print "Это то, что вы только что ввели?", txt
Вывод
Введите что-нибудь, чтобы проверить это: Привет, мир! Это то, что вы только что ввели? Привет, мир!
А вот как она работает в Python 3
# Python 3 txt = input("Введите что-нибудь, чтобы проверить это: ") print("Это то, что вы только что ввели?", txt)
Вывод
Введите что-нибудь, чтобы проверить это: Привет, мир 3! Это то, что вы только что ввели? Привет, мир 3!
Дальше в материале будет использоваться метод input из Python 3, если не указано другое.
Строковый и числовой ввод
По умолчанию функция input() конвертирует всю получаемую информацию в строку. Прошлый пример продемонстрировал это.
С числами нужно работать отдельно, поскольку они тоже изначально являются строками. Следующий пример показывает, как можно получить информацию числового типа:
# Ввод запрашивается и сохраняется в переменной test_text = input ("Введите число: ") # Преобразуем строку в целое число. # функция float() используется вместо int(), # для преобразования пользовательского ввода в десятичный формат, test_number = int(test_text) # Выводим в консоль переменную print ("Введенное число: ", test_number)
Вывод
Введите число: 13 Введенное число: 13
Того же можно добиться и таким образом:
test_number = int(input("Введите число: "))
Здесь сразу после сохранения ввода происходит преобразование и присваивание значения переменной.
Нужно лишь отметить, что если пользователь ввел не целое число, то код вернет исключение (даже если это число с плавающей точкой).
Обработка исключений ввода
Есть несколько способов, как можно удостовериться в том, что пользователь ввел корректные данные. Один из них — перехватывать все возможные ошибки, которые могут возникнуть.
Вот такой код считается небезопасным:
test2word = input("Сколько вам лет? ") test2num = int(test2word) print("Ваш возраст ", test2num)
Запустим его и введем следующее:
Сколько вам лет? Пять
При вызове функции int() со строкой Пять появится исключение ValueError , и программа остановит работу.
Вот как можно сделать код безопаснее и обработать ввод:
test3word = input("Введите свое счастливое число: ") try: test3num = int(test3word) print("Это правильный ввод! Ваше счастливое число: ", test3num) except ValueError: print("Это не правильный ввод. Это не число вообще! Это строка, попробуйте еще раз.")
Этот блок оценит ввод. Если он является целым числом, представленным в виде строки, то функция input() конвертирует его в целое число. Если нет, то программа выдаст исключение, но вместо ошибки оно будет перехвачено. В результате вызовется вторая инструкция print .
Вот так будет выглядеть вывод с исключением.
Введите свое счастливое число: Семь Это не правильный ввод. Это не число вообще! Это строка, попробуйте еще раз.
Такой код можно объединить с другой конструкцией, например, циклом for, чтобы убедиться, что код будет выполняться постоянно, до тех пор, пока пользователь не введет те данные, которые требуются.
Полный пример
# Создадим функцию для демонстрации примера def example(): # Бесконечный цикл, который продолжает выполняться # до возникновения исключения while True: test4word = input("Как вас зовут? ") try: test4num = int(input("Сколько часов вы играете на своем мобильном телефоне?" )) # Если полученный ввод не число, будет вызвано исключение except ValueError: # Цикл будет повторяться до правильного ввода print("Error! Это не число, попробуйте снова.") # При успешном преобразовании в целое число, # цикл закончится. else: print("Впечатляет, ", test4word, "! Вы тратите", test4num*60, "минут или", test4num*60*60, "секунд на игры в своем телефоне!") break # Вызываем функцию example()
Вывод:
Как вас зовут? Александр Сколько часов вы играете на своем мобильном телефоне? 3 Впечетляет, Александр! Вы тратите 180 минут или 10800 секунд на игры в своем телефоне!
Выводы
В этой статье вы узнали, как встроенные инструменты Python используются для получения пользовательского ввода в разных форматах. Также научились обрабатывать исключения и ошибки, которые могут возникнуть в процессе.
raw_input
prompt — Строка-приглашение, которая должна быть отправлена на стандартное устройство вывода (заключительный перевод каретки при этом удаляется).
Python 3
Функция переименована в input().
Функция считывает строку данных, полученную с устройства ввода и возвращает её без заключительного перевода каретки.
В случае считывания EOF (признак конца файла), поднимается исключение EOFError.
my_str = raw_input('Your string here: ') # Your string here: my string
my_str # my string
Если загружен модуль readline , тогда функция воспользуется им для удобства ввода пользователя (например, для поддержки истории команд).
Основы ввода и вывод данных
raw_input будет ждать пользователя , чтобы ввести текст , а затем возвращать результат в виде строки.
foo = raw_input("Put a message here that asks the user for input")
В приведенном выше примере foo будет хранить все входные пользователь предоставляет.
input будет ждать пользователя , чтобы ввести текст , а затем возвращать результат в виде строки.
foo = input("Put a message here that asks the user for input")
В приведенном выше примере foo будет хранить все входные пользователь предоставляет.
Использование функции печати
В Python 3 функции печати представлены в виде функции:
print("This string will be displayed in the output") # This string will be displayed in the output print("You can print \n escape characters too.") # You can print escape characters too.
В Python 2 print изначально был оператором, как показано ниже.
print "This string will be displayed in the output" # This string will be displayed in the output print "You can print \n escape characters too." # You can print escape characters too.
Примечание: использование from __future__ import print_function в Python 2 позволит пользователям использовать print() работают так же , как и Python 3 кода. Это доступно только в Python 2.6 и выше.
Функция запрашивать у пользователя номер
def input_number(msg, err_msg=None): while True: try: return float(raw_input(msg)) except ValueError: if err_msg is not None: print(err_msg) def input_number(msg, err_msg=None): while True: try: return float(input(msg)) except ValueError: if err_msg is not None: print(err_msg)
И использовать это:
user_number = input_number("input a number:", "that's not a number!")
Или, если вы не хотите «сообщение об ошибке»:
user_number = input_number("input a number: ")
Печать строки без перевода строки в конце
В Python 2.x, чтобы продолжить линию с print , конец print заявления с запятой. Это автоматически добавит пробел.
print "Hello,", print "World!" # Hello, World!
В Python 3.x, то print функция имеет дополнительный end параметр , который является то , что он печатает в конце данной строки. По умолчанию это символ перевода строки, поэтому эквивалентен этому:
print("Hello,", end="\n") print("World!") # Hello, # World!
Но вы могли бы передать в других строках
print("Hello,", end="") print("World!") # Hello, World! print("Hello,", end="
") print("World!") # Hello,
World! print("Hello,", end="BREAK") print("World!") # Hello, BREAKWorld!
Если вы хотите получить больше контроля над выходом, вы можете использовать sys.stdout.write :
import sys sys.stdout.write("Hello, ") sys.stdout.write("World!") # Hello, World!
Читать со стандартного ввода
Программы Python могут читать UniX трубопроводов.Вот простой пример того, как читать из stdin :
import sys for line in sys.stdin: print(line)
Имейте в виду , что sys.stdin представляет собой поток. Это означает, что цикл for завершится только после завершения потока.
Теперь вы можете направить вывод другой программы в вашу программу на Python следующим образом:
$ cat myfile | python myprogram.py
В этом примере cat myfile может быть любая команда Unix , которая выводит на stdout .
Кроме того , с помощью модуля FileInput может пригодиться:
import fileinput for line in fileinput.input(): process(line)
Ввод из файла
Ввод также может быть прочитан из файлов. Файлы могут быть открыты с помощью встроенной функции open .Использование with as , open with as синтаксис ( так называемый «Контекст — менеджер») делает работу с open и получить дескриптор файла супер легко:
with open('somefile.txt', 'r') as fileobj: # write code here using fileobj
Это гарантирует, что когда выполнение кода покидает блок, файл автоматически закрывается.
Файлы могут быть открыты в разных режимах. В приведенном выше примере файл открывается только для чтения. Чтобы открыть существующий файл для чтения только использовать r .Если вы хотите , чтобы прочитать этот файл как байты использовать rb .Для добавления данных в существующий файл с помощью. a Используйте w , чтобы создать файл или перезаписать существующие файлы с тем же именем. Вы можете использовать r+ , чтобы открыть файл для чтения и записи. Первый аргумент open() это имя файла, второй режим. Если режим остается пустым, то по умолчанию будет r .
# let's create an example file: with open('shoppinglist.txt', 'w') as fileobj: fileobj.write('tomato\npasta\ngarlic') with open('shoppinglist.txt', 'r') as fileobj: # this method makes a list where each line # of the file is an element in the list lines = fileobj.readlines() print(lines) # ['tomato\n', 'pasta\n', 'garlic'] with open('shoppinglist.txt', 'r') as fileobj: # here we read the whole content into one string: content = fileobj.read() # get a list of lines, just like int the previous example: lines = content.split('\n') print(lines) # ['tomato', 'pasta', 'garlic']
Если размер файла крошечный, безопасно прочитать все содержимое файла в память. Если файл очень большой, часто лучше читать построчно или по частям и обрабатывать ввод в том же цикле. Для этого:
with open('shoppinglist.txt', 'r') as fileobj: # this method reads line by line: lines = [] for line in fileobj: lines.append(line.strip())
При чтении файлов учитывайте характерные для операционной системы символы перевода строки. Хотя for line in fileobj автоматически удаляет их, это всегда безопасно вызывать strip() на линии чтения, как показано выше.
Открытые файлы ( fileobj в приведенных выше примерах) всегда указывают на определенное место в файле. Когда они первые открыли точки дескриптор файла в самом начале файла, который является положение 0 .Дескриптор файла может отображать его текущее положение с tell :
fileobj = open('shoppinglist.txt', 'r') pos = fileobj.tell() print('We are at %u.' % pos) # We are at 0.
После прочтения всего содержимого позиция обработчика файла будет указана в конце файла:
content = fileobj.read() end = fileobj.tell() print('This file was %u characters long.' % end) # This file was 22 characters long. fileobj.close()
Позиция обработчика файла может быть установлена на то, что нужно:
fileobj = open('shoppinglist.txt', 'r') fileobj.seek(7) pos = fileobj.tell() print('We are at character #%u.' % pos)
Вы также можете прочитать любую длину из содержимого файла во время данного вызова. Чтобы сделать это передать аргумент для read() .Когда read() вызывается без аргументов он не будет читать до конца файла. Если передать аргумент он прочтет , что количество байтов или символов, в зависимости от режима ( rb и r соответственно):
# reads the next 4 characters # starting at the current position next4 = fileobj.read(4) # what we got? print(next4) # 'cucu' # where we are now? pos = fileobj.tell() print('We are at %u.' % pos) # We are at 11, as we was at 7, and read 4 chars. fileobj.close()
Чтобы продемонстрировать разницу между символами и байтами:
with open('shoppinglist.txt', 'r') as fileobj: print(type(fileobj.read())) # with open('shoppinglist.txt', 'rb') as fileobj: print(type(fileobj.read())) #
В чем разница между `raw_input()` и `input()` в Python 3?
Разница в том, что raw_input() не существует в Python 3.x, в то время как input() это делает. На самом деле, старый raw_input() был переименован в input() , а старый input() исчез, но может быть легко имитирован с помощью eval(input()) . (Помните, что eval() — это зло. Попробуйте использовать более безопасные способы разбора вашего ввода, если это возможно.)
Поделиться 06 февраля 2011 в 18:53
В Python 2, raw_input() возвращает строку, а input() пытается запустить ввод в виде выражения Python. Поскольку получение строки почти всегда было тем, что вы хотели, Python 3 делает это с помощью input() . Как говорит Свен, если вы когда-либо хотите старое поведение, eval(input()) работает.
Поделиться 06 февраля 2011 в 19:01
Python 2:
- raw_input() принимает то, что пользователь ввел, и передает его обратно в виде строки.
- input() сначала принимает raw_input() , а затем выполняет eval() на нем.
Главное отличие заключается в том, что input() ожидает синтаксически правильного оператора Python, где raw_input() не выполняет его.
Python 3:
- raw_input() был переименован в input() , поэтому теперь input() возвращает точную строку.
- Старый input() был удален.
Если вы хотите использовать старый input() , то есть вам нужно оценить пользовательский ввод как оператор Python, вам нужно сделать это вручную, используя eval(input()) .
Поделиться 28 февраля 2013 в 07:07
В Python 3 raw_input() не существует, о чем уже упомянул Свен.
В Python 2 функция input() оценивает ваш ввод.
Пример:
name = input("what is your name ?") what is your name ?harsha Traceback (most recent call last): File "", line 1, in name = input("what is your name ?") File "", line 1, in NameError: name 'harsha' is not defined
В примере выше Python 2.x пытается оценить harsha как переменную, а не строку. Чтобы избежать этого, мы можем использовать двойные кавычки вокруг нашего ввода, такие как «harsh»:
>>> name = input("what is your name?") what is your name?"harsha" >>> print(name) harsha
raw_input()
Функция raw_input()` не оценивает, она просто прочитает то, что вы введете.
Example:
name = raw_input("what is your name ?") what is your name ?harsha >>> name 'harsha'
Пример:
name = eval(raw_input("what is your name?")) what is your name?harsha Traceback (most recent call last): File "", line 1, in name = eval(raw_input("what is your name?")) File "", line 1, in NameError: name 'harsha' is not defined
В примере выше я просто пытался оценить пользовательский ввод с помощью функции eval .
Поделиться 30 декабря 2015 в 16:01
Я хотел бы добавить немного больше деталей к объяснению, предоставленному всеми для пользователей python 2. raw_input() , который, на данный момент, вы знаете, что оценивает, какие данные вводит пользователь в виде строки. Это означает, что python не пытается понять введенные данные снова. Все, что он будет учитывать, это то, что введенные данные будут строковыми, независимо от того, является ли это фактической строкой или целочисленностью или чем-то еще.
В то время как input() , с другой стороны, пытается понять данные, введенные пользователем. Таким образом, ввод, как helloworld , даже покажет ошибку как ‘ helloworld is undefined ‘.
В заключение, для python 2, чтобы ввести строку, вам также нужно ввести ее как ‘ helloworld ‘, которая является общей структурой, используемой в python для использования строк.
Поделиться 15 июня 2015 в 20:52
Если вы хотите убедиться, что ваш код работает с python2 и python3, добавьте функцию input() в начале вашего скрипта:
from sys import version_info if version_info.major == 3: pass elif version_info.major == 2: try: input = raw_input except NameError: pass else: print ("Unknown python version - input function not safe")