БэкендPython

ValueError: invalid literal for int() в Python: как проверить ввод до преобразования

Разбираем ValueError invalid literal for int: пустой ввод, дроби, запятые, лишний текст, try except и повторный запрос значения.

Кодик

Автор

5 мин чтения

ValueError: invalid literal for int() with base 10 означает, что int() получил строку, которую нельзя целиком прочитать как десятичное целое число. Выведите вход через repr, решите, какие форматы допустимы, и выполняйте преобразование внутри узкого try. Пустая строка, "12.5", "12,5" и "12 лет" требуют разных решений.

Тип аргумента при этой ошибке обычно правильный: int умеет принимать строку. Проблема именно в значении. Поэтому замена на str убирает вычисление, а слепое удаление символов может превратить опечатку в другое число. Сначала зафиксируйте сырой ввод и контракт поля.

1Увидеть

repr(raw) показывает пустую строку, пробелы и скрытые символы.

2Определить

Поле должно принимать целое, дробное, знак или единицу измерения.

3Обработать

Поймать только ожидаемый ValueError рядом с преобразованием.

Что именно int считает допустимой строкой

int принимает цифры с необязательным знаком и окружающими пробелами. Десятичная точка, запятая, единица измерения или пустая строка уже не описывают целое число. Сообщение содержит проблемное представление после base 10, но для невидимых символов полезнее собственный repr прямо перед преобразованием.

samples = ['42', ' 42 ', '-7', '', '12.5', '12 лет']

for raw in samples:
    try:
        print(repr(raw), '->', int(raw))
    except ValueError:
        print(repr(raw), '-> ValueError')
СтрокаintПричина
"42"42Целое десятичное число
" 42 "42Крайние пробелы допустимы
"-7"-7Знак минус допустим
Пустая строкаValueErrorНет ни одной цифры
"12.5"ValueErrorЭто запись дробного числа
"12 лет"ValueErrorВ строке есть посторонний текст

Примеры строк которые принимает и отклоняет int в Python
int принимает целую запись целиком, а не извлекает цифры из произвольного текста.

Аргумент base 10 не означает число 10. Фраза with base 10 указывает систему счисления. Она не говорит, что значение должно быть меньше десяти. Строка "250" корректна, потому что состоит из десятичных цифр.

Как проверить ввод через try и except

Узкая обработка преобразования
  1. Считайте строку и сохраните её отдельно под именем raw_value.
  2. Поместите в try только вызов int, который ожидаемо может не сработать.
  3. В except ValueError покажите формат и пример допустимого значения.
  4. Расчёты выполняйте в else или после успешного преобразования.
  5. Не перехватывайте Exception, чтобы не скрыть ошибки вашего кода.
  6. Проверьте корректное число, пустой ввод, буквы и граничные значения.

Узкий блок важен для точности. Если внутри try находятся чтение файла, обращение к списку и формула, except ValueError может поймать проблему совсем другого преобразования. Одно потенциально опасное действие даёт понятный маршрут и сохраняет полноценный Traceback для остальных багов.

raw_count = input('Количество: ')

try:
    count = int(raw_count)
except ValueError:
    print('Введите целое число, например 3')
else:
    print(f'Принято: {count}')

Узкий блок try except вокруг int в Python
Обработка охватывает только ожидаемое преобразование, а остальной код сохраняет свои ошибки.

Сообщение должно объяснять следующий шаг

Фраза «неверный ввод» не говорит, что исправить. Укажите формат и пример: «Введите целое число, например 3». Если отрицательные значения запрещены, это отдельная проверка после int, а не часть ValueError.

Дроби, запятые и текст с единицами

Не заменяйте int на float автоматически. Если поле означает количество билетов, значение 2.5 должно быть отклонено. Для температуры или веса дробь может быть нормой. Запятая зависит от выбранного пользовательского формата, а строку с единицей лучше разделять на отдельные поле и подпись интерфейса.

Требование поляПодходДополнительная проверка
Только целоеint(raw)Диапазон после преобразования
Дробное с точкойfloat(raw)Конечность и диапазон
Дробное с запятойНормализация по явному форматуНе заменять тысячи и десятичный знак вслепую
Число и единицаОтдельное поле или строгий парсерРазрешённые единицы
Необязательное полеПроверка пустой строки до intЗначение по умолчанию по контракту
raw_temperature = input('Температура, например 21.5: ').strip()
normalized = raw_temperature.replace(',', '.', 1)

try:
    temperature = float(normalized)
except ValueError:
    print('Введите число без единицы измерения')
else:
    print(f'Температура: {temperature:.1f} °C')

Разделение проверки формата числа и допустимого диапазона
Сначала строка становится числом, затем правила задачи проверяют значение.

Нормализация допустима только при известном формате. Замена первой запятой на точку подходит простому полю температуры, где разделитель тысяч не используется. Для денег, локализованных форматов и импортируемых таблиц нужен специальный парсер и явные правила, иначе строка может превратиться в неверное число без ошибки.

Проверки, которые создают новые ошибки

Метод isdigit удобен для демонстрации цифр, но не принимает отрицательное число и не проверяет диапазон. Цепочка replace способна удалить важный символ. А значение 0 по умолчанию может незаметно изменить заказ. Надёжнее попытаться выполнить именно нужное преобразование и отдельно проверить бизнес-ограничения.

Использовать except без типа

Так скрываются NameError, ошибки файлов и программные баги. Ловите ожидаемый ValueError.

Подставлять ноль при любом вводе

Опечатка превращается в допустимое значение и проходит дальше по системе.

Удалять все нецифровые символы

Минус, десятичный разделитель или ошибка пользователя исчезают вместе со смыслом.

Смешивать проверку формата и диапазона

Сначала получите число, затем проверяйте минимум, максимум и допустимость нуля.

ValueError отделяет формат от правил задачи

Строка "-3" корректно преобразуется в целое, но отрицательное количество может быть запрещено. Это не ValueError, а отдельное правило. Такое разделение даёт пользователю точное сообщение и облегчает тесты.

Практика: повторять вопрос до корректного числа

Для консольной программы удобно вынести ввод в функцию с циклом. Она возвращает только проверенное целое, а основной код не знает о строках и исключениях. Добавьте минимальное и максимальное значение, чтобы функция выражала полный контракт поля.

Сценарии для проверки
  1. Введите обычное целое число и сравните результат.
  2. Нажмите Enter без текста и убедитесь, что программа спрашивает снова.
  3. Введите буквы и проверьте понятное сообщение.
  4. Введите отрицательное число и примените правило диапазона.
  5. Введите значение выше максимума и не принимайте его молча.
  6. После корректного ввода убедитесь, что цикл завершился один раз.
Не создавайте бесконечный цикл без пути успеха. Внутри while True должен быть явный return или break после всех проверок. Протестируйте последовательность «ошибка, затем правильное число», а не только одиночный ввод.
Короткие ответы
Что означает invalid literal?

Строковое представление не соответствует формату, который может разобрать int для указанной системы счисления.

Принимает ли int пробелы по краям?

Да, обычные окружающие пробелы допустимы.

Почему 12.5 не подходит int?

Это запись дробного числа, а int ожидает целое строковое представление.

Достаточно ли isdigit?

Не всегда: метод не покрывает знак минус и не проверяет диапазон задачи.

Что должно быть внутри try?

Только ожидаемо опасное преобразование и минимум тесно связанных операций.

Превратите сырой ввод в явный контракт

Потренируйтесь с вводом и исключениями в курсе Python. Условия диапазона разберите в статье про if, elif и else, а общую диагностику повторите по материалу о частых ошибках.

Если сообщение находится глубоко в вызовах, поможет руководство по запуску Python-скрипта. В Кодике сохраните сырое repr, ожидаемый формат и набор граничных значений.