ValueError when parsing input in Python (Fix)
ValueError often happens when your program reads text with input() and then tries to convert that text into a number.
This usually affects code that uses int() or float(). For example, the user might type letters instead of digits, leave the input blank, or enter a decimal when your code expects a whole number.
This page shows:
- what the error means
- how to reproduce it
- simple ways to fix it
- how to prevent it in beginner-friendly code
Quick fix #
user_text = input("Enter a number: ").strip()
try:
number = int(user_text)
print("You entered:", number)
except ValueError:
print("Please enter a whole number only.")
Use try-except when converting input with int() or float(). strip() also helps remove accidental spaces.
What this error means #
ValueError means Python received a value of the correct general type, but the content is not valid for the operation.
When parsing input, this often happens when you try to:
- convert text to an integer with
int() - convert text to a decimal number with
float() - unpack values from
split()and the number of parts is wrong
Common examples:
int("abc")int("")float("")a, b = input().split()when the input does not contain exactly two parts
If you are new to exceptions, see Python errors and exceptions explained.
Common example that causes the error #
A very common beginner pattern is this:
age = int(input("Enter your age: "))
print("Next year you will be", age + 1)
This works only if the user enters a valid whole number.
If the user types hello, Python raises an error:
age = int(input("Enter your age: "))
Example input:
hello
Typical error message:
ValueError: invalid literal for int() with base 10: 'hello'
That happens because input() always returns a string. If you want to learn more about that, see Python input() function explained and Python int() function explained.
Fix 1: Use try-except around the conversion #
This is the best fix when input comes from a real user.
Wrap the conversion in a try-except block so your program does not crash.
user_text = input("Enter a whole number: ")
try:
number = int(user_text)
print("Valid number:", number)
except ValueError:
print("That was not a valid whole number.")
What this does:
try:runs the risky code- if
int(user_text)fails, Python jumps toexcept ValueError: - your program prints a helpful message instead of stopping
You can do the same with float():
user_text = input("Enter a decimal number: ")
try:
number = float(user_text)
print("Valid number:", number)
except ValueError:
print("Please enter a valid number.")
If you want more practice with this pattern, see how to use try-except blocks in Python.
Fix 2: Validate input before converting #
Sometimes you want to reject bad input before calling int().
For simple positive integers, isdigit() can help:
user_text = input("Enter a whole number: ").strip()
if user_text.isdigit():
number = int(user_text)
print("Valid number:", number)
else:
print("Please enter digits only.")
This works for values like:
"5""42""123"
But it does not work for:
- negative numbers like
"-5" - decimals like
"3.14" - empty strings like
""
So isdigit() is useful for simple checks, but it is not a complete replacement for try-except.
Fix 3: Clean the input first #
Sometimes the text is almost correct, but it contains spaces or formatting that causes problems.
Use strip() to remove spaces at the start and end:
user_text = input("Enter a number: ").strip()
try:
number = int(user_text)
print(number)
except ValueError:
print("Invalid input")
This helps with input like:
" 25 "
You can also clean other formatting if needed. For example, some users may paste numbers with commas:
user_text = input("Enter a number: ").strip()
user_text = user_text.replace(",", "")
try:
number = int(user_text)
print("Parsed number:", number)
except ValueError:
print("Please enter a valid whole number.")
Example:
"1,000"becomes"1000"
Be careful with replacements. Only clean the formats you actually expect.
Fix 4: Ask again until the input is valid #
For many beginner programs, the best user experience is to keep asking until the user enters valid input.
while True:
user_text = input("Enter a whole number: ").strip()
try:
number = int(user_text)
break
except ValueError:
print("That was not a valid whole number. Try again.")
print("You entered:", number)
Why this is useful:
- the program does not crash
- the user gets another chance
- your code stays simple and focused
You can use the same pattern with float() if you expect decimal input. For a full walkthrough, see how to convert user input to numbers in Python.
Special cases beginners hit #
Some ValueError cases are confusing at first. Here are a few common ones.
int('3.5') #
print(int("3.5"))
This raises ValueError because "3.5" is a decimal string, not a whole number string.
If you expect decimal input, use float() instead:
print(float("3.5"))
float('') #
print(float(""))
This raises ValueError because an empty string is not a number.
This often happens when:
- the user just presses Enter
- you forgot to check for empty input
Unpacking from split() #
a, b = input("Enter two values: ").split()
print(a, b)
This works only if the input has exactly two parts.
For example:
- input:
"10 20"→ works - input:
"10"→ not enough values - input:
"10 20 30"→ too many values
These cases can raise different ValueError messages. See:
How to debug the input value #
If the error does not make sense, inspect the actual input.
Useful debugging lines:
user_input = input("Enter something: ")
print(user_input)
print(repr(user_input))
print(type(user_input))
Why repr() helps:
- it shows hidden spaces
- it makes empty strings easier to see
- it can reveal unexpected characters
Example:
user_input = " 42 "
print(user_input) # looks like: 42
print(repr(user_input)) # shows: ' 42 '
For split() problems, inspect the list of parts:
parts = input("Enter values: ").split()
print(parts, len(parts))
This helps you see whether you got the number of values you expected.
When to use int() vs float() #
Choose the conversion based on the kind of number you expect.
Use int() for whole numbers:
542100
Use float() for decimal numbers:
3.142.00.5
Example:
whole = int("5")
decimal = float("3.14")
print(whole)
print(decimal)
If your program may receive either whole numbers or decimals, float() is often the better choice.
For example:
user_text = input("Enter a number: ").strip()
try:
number = float(user_text)
print("Valid number:", number)
except ValueError:
print("Please enter a valid number.")
If needed, you can later convert a valid float to an integer, but only if that makes sense for your program. See Python float() function explained for more details.
Common causes #
This error often happens because:
- user entered letters instead of digits
- user entered a decimal when
int()was used - input was empty
- input had extra spaces or formatting
- code unpacked the wrong number of values from
split() - program assumed input was always valid
FAQ #
Why does int('3.0') raise ValueError? #
Because int() expects a whole number string like "3", not a decimal string like "3.0". Convert with float() first if needed.
Does strip() fix ValueError by itself? #
Only sometimes. It removes spaces at the start and end, but it does not turn invalid text like "abc" into a number.
Should I use isdigit() instead of try-except? #
isdigit() is useful for simple cases, but try-except is more flexible and handles more real input situations.
Can input() return an int automatically? #
No. input() always returns a string, so you must convert it yourself.