ValueError: invalid literal for int() with base 10 означает, что int() получил строку, которую нельзя целиком прочитать как десятичное целое число. Выведите вход через repr, решите, какие форматы допустимы, и выполняйте преобразование внутри узкого try. Пустая строка, "12.5", "12,5" и "12 лет" требуют разных решений.
Тип аргумента при этой ошибке обычно правильный: int умеет принимать строку. Проблема именно в значении. Поэтому замена на str убирает вычисление, а слепое удаление символов может превратить опечатку в другое число. Сначала зафиксируйте сырой ввод и контракт поля.
repr(raw) показывает пустую строку, пробелы и скрытые символы.
Поле должно принимать целое, дробное, знак или единицу измерения.
Поймать только ожидаемый 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 принимает целую запись целиком, а не извлекает цифры из произвольного текста.
with base 10 указывает систему счисления. Она не говорит, что значение должно быть меньше десяти. Строка "250" корректна, потому что состоит из десятичных цифр.Как проверить ввод через try и except
- Считайте строку и сохраните её отдельно под именем
raw_value. - Поместите в
tryтолько вызовint, который ожидаемо может не сработать. - В
except ValueErrorпокажите формат и пример допустимого значения. - Расчёты выполняйте в
elseили после успешного преобразования. - Не перехватывайте
Exception, чтобы не скрыть ошибки вашего кода. - Проверьте корректное число, пустой ввод, буквы и граничные значения.
Узкий блок важен для точности. Если внутри try находятся чтение файла, обращение к списку и формула, except ValueError может поймать проблему совсем другого преобразования. Одно потенциально опасное действие даёт понятный маршрут и сохраняет полноценный Traceback для остальных багов.
raw_count = input('Количество: ')
try:
count = int(raw_count)
except ValueError:
print('Введите целое число, например 3')
else:
print(f'Принято: {count}')
Обработка охватывает только ожидаемое преобразование, а остальной код сохраняет свои ошибки.
Фраза «неверный ввод» не говорит, что исправить. Укажите формат и пример: «Введите целое число, например 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 по умолчанию может незаметно изменить заказ. Надёжнее попытаться выполнить именно нужное преобразование и отдельно проверить бизнес-ограничения.
Так скрываются NameError, ошибки файлов и программные баги. Ловите ожидаемый ValueError.
Опечатка превращается в допустимое значение и проходит дальше по системе.
Минус, десятичный разделитель или ошибка пользователя исчезают вместе со смыслом.
Сначала получите число, затем проверяйте минимум, максимум и допустимость нуля.
Строка "-3" корректно преобразуется в целое, но отрицательное количество может быть запрещено. Это не ValueError, а отдельное правило. Такое разделение даёт пользователю точное сообщение и облегчает тесты.
Практика: повторять вопрос до корректного числа
Для консольной программы удобно вынести ввод в функцию с циклом. Она возвращает только проверенное целое, а основной код не знает о строках и исключениях. Добавьте минимальное и максимальное значение, чтобы функция выражала полный контракт поля.
- Введите обычное целое число и сравните результат.
- Нажмите Enter без текста и убедитесь, что программа спрашивает снова.
- Введите буквы и проверьте понятное сообщение.
- Введите отрицательное число и примените правило диапазона.
- Введите значение выше максимума и не принимайте его молча.
- После корректного ввода убедитесь, что цикл завершился один раз.
while True должен быть явный return или break после всех проверок. Протестируйте последовательность «ошибка, затем правильное число», а не только одиночный ввод.Что означает invalid literal?
Строковое представление не соответствует формату, который может разобрать int для указанной системы счисления.
Принимает ли int пробелы по краям?
Да, обычные окружающие пробелы допустимы.
Почему 12.5 не подходит int?
Это запись дробного числа, а int ожидает целое строковое представление.
Достаточно ли isdigit?
Не всегда: метод не покрывает знак минус и не проверяет диапазон задачи.
Что должно быть внутри try?
Только ожидаемо опасное преобразование и минимум тесно связанных операций.
Потренируйтесь с вводом и исключениями в курсе Python. Условия диапазона разберите в статье про if, elif и else, а общую диагностику повторите по материалу о частых ошибках.
Если сообщение находится глубоко в вызовах, поможет руководство по запуску Python-скрипта. В Кодике сохраните сырое repr, ожидаемый формат и набор граничных значений.