Tutorials Logic, IN +91 8092939553 info@tutorialslogic.com
Navigation
Home About Us Contact Us Blogs FAQs
Tutorials
All Tutorials
Services
Academic Projects Resume Writing Interview Questions Website Development
Compiler Tutorials

ValueError in Python — invalid literal for int() Fix (2026) | Tutorials Logic

What is ValueError?

A ValueError occurs in Python when a function receives an argument of the correct type but with an inappropriate value. For example, calling int("abc") passes a string (correct type) but the value "abc" cannot be converted to an integer. This is distinct from TypeError, which is about the wrong type entirely.

Common Causes

  • Calling int(), float(), or complex() on a non-numeric string
  • Unpacking a sequence with too many or too few values
  • Passing an invalid value to a function that expects a specific range or format
  • Using list.remove() with a value not in the list
  • Passing an invalid string format to datetime.strptime()

Quick Fix (TL;DR)

Quick Solution
# ❌ Problem
user_input = "abc"
number = int(user_input)  # ValueError: invalid literal for int() with base 10: 'abc'

# ✅ Solution
user_input = "abc"
try:
    number = int(user_input)
except ValueError:
    print(f"'{user_input}' is not a valid integer")
    number = 0

Common Scenarios & Solutions

Scenario 1: int() on a Non-Numeric String

The most common ValueError — trying to convert user input or data from a file/API to an integer when the string contains non-numeric characters. Always validate or use try/except when converting user-provided strings.

Problem
age = input("Enter your age: ")  # User types "twenty"
age_int = int(age)               # ValueError: invalid literal for int() with base 10: 'twenty'
Solution
def get_age():
    while True:
        age = input("Enter your age: ")
        try:
            return int(age)
        except ValueError:
            print(f"'{age}' is not a valid number. Please try again.")

age = get_age()
print(f"Your age is: {age}")

Scenario 2: Too Many Values to Unpack

When unpacking a sequence into variables, the number of variables must match the number of elements. If there are more or fewer elements than expected, Python raises a ValueError.

Problem
data = "Alice,30,Engineer,New York"
name, age = data.split(",")  # ValueError: too many values to unpack (expected 2)
Solution
data = "Alice,30,Engineer,New York"

# ✅ Use * to capture remaining values
name, age, *rest = data.split(",")
print(name)  # "Alice"
print(age)   # "30"
print(rest)  # ["Engineer", "New York"]

# ✅ Or unpack all expected fields
name, age, job, city = data.split(",")  # Exact match

Scenario 3: Invalid Enum Value

When using Python's Enum class or functions that accept a limited set of valid values, passing an invalid value raises a ValueError. This is intentional — it enforces valid input.

Problem
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

color = Color("YELLOW")  # ValueError: 'YELLOW' is not a valid Color
Solution
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

# ✅ Validate before creating
def get_color(name):
    try:
        return Color[name.upper()]
    except KeyError:
        print(f"'{name}' is not a valid color. Choose: {[c.name for c in Color]}")
        return None

color = get_color("RED")    # Color.RED
color = get_color("YELLOW") # Prints error, returns None

Scenario 4: Wrong Date/Time Format

The datetime.strptime() function raises a ValueError if the string does not match the specified format. This is common when parsing dates from user input or external data sources.

Problem
from datetime import datetime

date_str = "2024/01/15"
date = datetime.strptime(date_str, "%d-%m-%Y")  # ValueError: time data '2024/01/15' does not match format '%d-%m-%Y'
Solution
from datetime import datetime

date_str = "2024/01/15"

# ✅ Match the format to the actual string
date = datetime.strptime(date_str, "%Y/%m/%d")  # Correct format
print(date)  # 2024-01-15 00:00:00

# ✅ Handle multiple formats
formats = ["%Y/%m/%d", "%d-%m-%Y", "%Y-%m-%d"]
for fmt in formats:
    try:
        date = datetime.strptime(date_str, fmt)
        break
    except ValueError:
        continue

Best Practices

  • Always wrap type conversions in try/except - User input and external data are unpredictable; always handle ValueError when converting strings to numbers.
  • Validate before converting - Use str.isdigit() or str.isnumeric() to pre-validate strings before calling int().
  • Use * in unpacking for variable-length sequences - first, *rest = my_list handles lists of any length without ValueError.
  • Raise ValueError in your own functions - When a function receives an invalid value, raise ValueError with a descriptive message.
  • Document valid value ranges - Use docstrings and type hints to document what values a function accepts.
  • Use dateutil for flexible date parsing - The python-dateutil library handles many date formats automatically without manual format strings.
  • Test with edge cases - Test your code with empty strings, None, and boundary values to catch ValueError before production.

Related Errors

Key Takeaways
  • ValueError occurs when a function receives the right type but an inappropriate value.
  • The most common case is calling int() or float() on a non-numeric string.
  • Always wrap type conversions from user input in try/except ValueError.
  • Use str.isdigit() to pre-validate strings before converting to integers.
  • Unpacking requires the exact number of variables to match sequence length — use *rest for flexibility.
  • Raise ValueError in your own functions when inputs are out of the valid range.

Frequently Asked Questions


Ready to Level Up Your Skills?

Explore 500+ free tutorials across 20+ languages and frameworks.