PythonのValueErrorとは?意味・原因・直し方を初心者向けに解説

ながみえ

Pythonでプログラムを書いていると、ValueError というエラーが表示されることがあります。

特に、文字列を数値に変換しようとしたときや、ユーザーが入力した値を処理しようとしたときによく発生します。

エラー名を見ると少し難しく感じるかもしれませんが、ValueError は「値の中身が処理に合っていない」という意味で考えると理解しやすくなります。

この記事では、Pythonの ValueError がどのようなエラーなのか、なぜ発生するのか、どのように直せばよいのかを初心者向けに解説します。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド

ValueErrorとは

ValueError とは、Pythonで「データの型は合っているものの、値の中身が処理に適していない」ときに発生するエラーです。

たとえば、Pythonでは int() を使うと、文字列を整数に変換できます。

number = int("123")
print(number)

このコードでは、"123" という文字列は整数として読み取れるため、問題なく 123 に変換できます。

しかし、次のようなコードではエラーになります。

number = int("abc")
print(number)

この場合、"abc" は文字列ではありますが、整数として読み取ることはできません。そのため、Pythonは次のようなエラーを表示します。

ValueError: invalid literal for int() with base 10: 'abc'

ここで大切なのは、int() に文字列を渡していること自体が問題なのではない、という点です。

int("123") のように、整数として読める文字列であれば変換できます。一方で、int("abc") のように整数として読めない文字列を渡すと、値の中身が不適切だと判断されて ValueError になります。

つまり、ValueError は「使い方の形は合っているけれど、渡された値の内容が合っていないときに出るエラー」と考えると分かりやすいです。

Python初心者の方は、ValueError が出たらまず「どの値が処理に合っていないのか」を確認してみましょう。特に、int()float() で数値に変換している部分、input() で受け取った入力内容を処理している部分は、原因になりやすいポイントです。

ValueErrorが起きる主な原因

ValueError は、値の中身が処理に合っていないときに発生します。

特にPython初心者の方がよく出会うのは、文字列を数値に変換するときや、リストの中にない値を扱おうとしたときです。

まずは、どのような場面で ValueError が発生しやすいのかを確認しておきましょう。

原因よくある場面確認すること
数値に変換できない文字列を渡しているint("abc")
float("3.14円")
文字列の中身が数値として読めるか
input() の入力内容が想定と違う年齢や点数を入力させる処理入力された値に文字や記号が混ざっていないか
分割した値の数が合っていないname, age = text.split(",")変数の数とデータの数が合っているか
リストに存在しない値を指定しているremove()
index()
その値がリスト内にあるか
関数に不適切な値を渡している数値変換、日付変換、数学関数など関数が受け取れる値か

ValueError が出たときは、エラーが発生した行だけでなく、その行で使っている値の中身を確認することが大切です。

たとえば、次のようなコードでは ValueError が発生します。

number = int("100円")
print(number)

"100円" は文字列としては問題ありませんが、整数として見ると "円" という文字が含まれています。そのため、int() では数値に変換できません。

この場合は、次のように数値だけの文字列にする必要があります。

number = int("100")
print(number)

このように、ValueError は「型が完全に間違っている」というよりも、「処理しようとしている値の内容に問題がある」ときに発生します。

そのため、エラーを直すときは、まず変数の中身を print() で表示してみるのがおすすめです。

text = "100円"
print(text)

number = int(text)
print(number)

このように途中で値を確認すると、「どの値が原因でエラーになっているのか」を見つけやすくなります。

ValueErrorのエラー例と修正例

ここからは、実際に ValueError が発生するコードと、その直し方を見ていきましょう。

ValueError はいろいろな場面で発生しますが、Python初心者の方が特につまずきやすいのは、文字列を数値に変換するときです。

まずは、よくある int() の変換ミスから確認していきます。

数値に変換できない文字列をint()に渡している

int() は、文字列を整数に変換するときに使う関数です。

たとえば、"10""2024" のように、整数として読める文字列であれば問題なく変換できます。

しかし、整数として読めない文字列を渡すと、ValueError が発生します。

age = int("二十歳")
print(age)

このコードを実行すると、次のようなエラーが表示されます。

ValueError: invalid literal for int() with base 10: '二十歳'

"二十歳" は人間には意味が分かる文字列ですが、Pythonにとっては整数として変換できる形ではありません。

この場合は、次のように数値だけの文字列に修正します。

age = int("20")
print(age)

このコードでは、"20" が整数として読み取れるため、int()20 に変換できます。

ValueError: invalid literal for int() with base 10 というエラーが出たときは、まず int() に渡している値を確認しましょう。

特に、次のような値は int() で変換できないため注意が必要です。

int()で変換できるか理由
"100"できる整数として読めるため
"100円"できない数字以外の文字が含まれているため
"abc"できない整数として読めないため
"3.14"できない小数の文字列なので整数としては変換できないため
" 100 "できる前後の空白は無視されるため

"3.14" のような小数を扱いたい場合は、int() ではなく float() を使います。

number = float("3.14")
print(number)

このように、どの関数で、どのような値を変換しようとしているのかを確認することが大切です。

input()で入力された値を数値に変換できない

input() を使ってユーザーに数字を入力してもらう処理でも、ValueError はよく発生します。

たとえば、次のコードでは、入力された値を int() で整数に変換しようとしています。

score = int(input("点数を入力してください:"))
print(score)

ここでユーザーが次のように入力したとします。

八十

この場合、"八十" は整数として変換できないため、ValueError が発生します。

ValueError: invalid literal for int() with base 10: '八十'

input() で受け取った値は、必ず文字列になります。

そのため、数字を入力してもらうつもりでも、実際には文字や記号が入力される可能性があります。

たとえば、次のような入力は int() で変換できません。

入力された値ValueErrorになる理由
八十整数として読めないため
80点数字以外の文字が含まれているため
80.5小数なので int() ではそのまま変換できないため
何も入力しない空文字は整数に変換できないため

このようなエラーを防ぐには、変換する前に入力内容を確認します。

score_text = input("点数を入力してください:")

if score_text.isdigit():
    score = int(score_text)
    print(score)
else:
    print("数字で入力してください")

isdigit() は、文字列が数字だけでできているかを確認するメソッドです。

このコードでは、入力された値が数字だけの場合に int() で変換し、それ以外の場合はエラーメッセージを表示しています。

ただし、isdigit() は小数やマイナスの数には対応しにくい場合があります。

たとえば、"3.14""-10" は、数字として扱いたい場面もありますが、isdigit() では単純に判定できません。

そのような場合は、あとで紹介する try / except を使う方法が便利です。

float()に数値として読めない文字列を渡している

小数を扱いたいときは、float() を使います。

float() は、文字列を小数に変換する関数です。

price = float("3.14")
print(price)

このコードでは、"3.14" を小数の 3.14 に変換できます。

しかし、数値以外の文字が混ざっていると、ValueError が発生します。

price = float("3.14円")
print(price)

このコードでは、文字列の中に "円" が含まれているため、Pythonは小数として変換できません。

修正する場合は、次のように数値だけの文字列を渡します。

price = float("3.14")
print(price)

ユーザー入力やCSVファイルのデータでは、数値に見えても単位や記号が混ざっていることがあります。

たとえば、金額、割合、重さなどのデータでは、次のような値に注意しましょう。

float()で変換できるか注意点
"3.14"できる小数として変換できる
"100"できる整数の文字列も小数に変換できる
"3.14円"できない単位が混ざっている
"50%"できない記号が混ざっている
"約10"できない数字以外の文字が含まれている

ValueError を直すときは、「見た目が数字っぽいか」ではなく、「Pythonが数値として読める形か」を確認することが大切です。

リストに存在しない値を削除しようとしている

リストの中から特定の値を削除するときに使う remove() でも、ValueError が発生することがあります。

remove() は、指定した値がリストの中に存在する場合に、その値を削除するメソッドです。

たとえば、次のコードは問題なく動きます。

fruits = ["apple", "banana", "orange"]

fruits.remove("banana")
print(fruits)

"banana" はリストの中にあるため、削除できます。

しかし、次のようにリストに存在しない値を削除しようとすると、ValueError が発生します。

fruits = ["apple", "banana", "orange"]

fruits.remove("grape")
print(fruits)

このコードでは、"grape" はリストの中にありません。

そのため、Pythonは削除する対象を見つけられず、次のようなエラーを表示します。

ValueError: list.remove(x): x not in list

このエラーを防ぐには、削除する前に、その値がリストの中にあるかを確認します。

fruits = ["apple", "banana", "orange"]

if "grape" in fruits:
    fruits.remove("grape")
    print(fruits)
else:
    print("grapeはリストにありません")

in を使うと、指定した値がリストの中にあるかどうかを確認できます。

remove() を使うときは、「削除したい値が本当にリストに入っているか」を先に確認すると安全です。

また、リストの中から値の位置を調べる index() でも、存在しない値を指定すると ValueError が発生します。

fruits = ["apple", "banana", "orange"]

index = fruits.index("grape")
print(index)

この場合も、"grape" がリストの中にないため、次のようなエラーになります。

ValueError: 'grape' is not in list

remove()index() を使うときは、対象の値がリストに存在するかを確認する習慣をつけておくと、ValueError を防ぎやすくなります。

ValueErrorが出たときの確認ポイント

ValueError が出たときは、あわててコード全体を見直すよりも、まず「どの値が原因になっているのか」を順番に確認することが大切です。

エラーが発生した行だけでなく、その行で使っている変数の中身にも注目しましょう。

確認するときは、次のような流れで見ると原因を見つけやすくなります。

確認すること見るポイント
エラーメッセージの最後の1行どの種類の ValueError かを確認する
エラーが発生した行int()float()split()remove() などを使っていないか確認する
変数の中身想定している値が入っているか確認する
入力された値空文字、単位、記号、全角文字などが混ざっていないか確認する
データの数変数の数と分割後の値の数が合っているか確認する

まず確認したいのは、エラーメッセージの最後の1行です。

たとえば、次のようなエラーが表示されたとします。

ValueError: invalid literal for int() with base 10: 'abc'

この場合は、int() で整数に変換できない値を渡していることが分かります。

エラー文の中に 'abc' と表示されているため、原因になっている値も確認できます。

次に、エラーが発生した行で使っている変数の中身を確認しましょう。

text = "abc"

print(text)

number = int(text)
print(number)

このように、エラーが出る前に print() を入れると、実際にどのような値が入っているのかを確認できます。

自分では数字が入っているつもりでも、実際には文字や記号が混ざっていることがあります。

たとえば、次のような値は見た目では数値に近くても、int() では変換できません。

原因
"100円"数字以外の文字が含まれている
"80点"単位が含まれている
"3.14"小数なので int() ではそのまま変換できない
""何も入力されていない
"abc"整数として読めない

input() を使っている場合は、ユーザーがどのような値を入力したのかを確認することも重要です。

score_text = input("点数を入力してください:")

print(score_text)

score = int(score_text)
print(score)

このように入力された値を一度表示すると、空白や文字が混ざっていないかを確認できます。

また、split() を使っている場合は、分割後の値の数を確認しましょう。

text = "Taro,20,Tokyo"

data = text.split(",")

print(data)
print(len(data))

len() を使うと、分割後のデータがいくつあるのかを確認できます。

複数の変数に代入している場合は、左側の変数の数と、右側の値の数が合っているかを見直しましょう。

リストの remove()index()ValueError が出る場合は、指定した値がリストの中に存在するかを確認します。

fruits = ["apple", "banana", "orange"]

print("grape" in fruits)

このコードでは、"grape" がリストの中にあるかどうかを確認しています。

結果が False の場合、その値はリストに存在しないため、remove()index() を使うと ValueError が発生します。

ValueError を解決するときは、エラー名だけで判断するのではなく、実際に渡している値を確認することが大切です。

特に、数値変換、ユーザー入力、文字列の分割、リスト操作では、値の中身を丁寧に見るようにしましょう。

ValueErrorに関するよくある質問

ここでは、Pythonの ValueError について、初心者の方が疑問に感じやすいポイントをQ&A形式で整理します。

エラーメッセージの意味や、TypeError との違い、try / except の使い方で迷ったときの参考にしてください。

ValueError: invalid literal for int() with base 10 とはどういう意味ですか?

ValueError: invalid literal for int() with base 10 は、int() で整数に変換できない文字列を渡したときによく表示されるエラーです。

たとえば、次のコードでは ValueError が発生します。

number = int("abc")
print(number)

"abc" は文字列としては問題ありませんが、整数として読み取ることはできません。

そのため、Pythonは「この値は整数に変換できません」と判断して、ValueError を表示します。

同じように、次のような値も int() では変換できません。

変換できない理由
"100円"数字以外の文字が含まれているため
"abc"整数として読めないため
"3.14"小数の文字列なので、そのまま整数にはできないため
""何も入力されていないため

このエラーが出たときは、まず int() に渡している値の中身を確認しましょう。

input()で数字を入力したのにValueErrorが出るのはなぜですか?

input() で数字を入力したつもりでも、実際には整数として変換できない文字が混ざっている可能性があります。

input() で受け取った値は、常に文字列です。

たとえば、次のコードを見てみましょう。

age = int(input("年齢を入力してください:"))
print(age)

ここで 20 と入力すれば問題なく動きます。

しかし、20歳二十 のように入力すると、int() では整数に変換できないため ValueError が発生します。

また、空のままEnterキーを押した場合も、空文字を整数に変換しようとしてエラーになります。

入力値が原因かどうかを調べたいときは、いったん変数に入れてから print() で確認すると分かりやすいです。

age_text = input("年齢を入力してください:")

print(age_text)

age = int(age_text)
print(age)

このように書くと、実際にどのような値が入力されているのかを確認できます。

ValueErrorはtry exceptで直すべきですか?

ユーザー入力のように、どのような値が入るか分からない場面では、try / except を使うと便利です。

たとえば、数字を入力してもらう処理では、次のように書けます。

try:
    number = int(input("数字を入力してください:"))
    print(number)
except ValueError:
    print("数字として変換できません")

このコードでは、整数に変換できる値が入力された場合は、そのまま number に代入されます。

一方で、abc100円 のように整数に変換できない値が入力された場合は、except ValueError の部分が実行されます。

ただし、初心者のうちは、すぐに try / except で囲むだけで終わらせるのではなく、まず「どの値が原因でエラーになっているのか」を確認することも大切です。

print() で変数の中身を確認し、エラーの原因を理解したうえで try / except を使うと、より実践的な書き方が身につきます。

まとめ|ValueErrorは値の中身を確認しよう

ValueError は、型は合っているものの、値の中身が処理に合っていないときに発生するエラーです。

特に、int()float() で数値に変換するとき、input() で受け取った値を処理するとき、split() で分割した値を複数の変数に代入するとき、リストの remove()index() を使うときによく発生します。

ValueError が出たときは、まずエラーメッセージの最後の1行を確認しましょう。次に、エラーが発生した行で使っている値を print() で表示すると、原因を見つけやすくなります。

また、ユーザー入力のように想定外の値が入る可能性がある場合は、if 文で事前に確認したり、try / except でエラーに対応したりすると安全です。

ValueError は、値の中身を丁寧に確認すれば解決しやすいエラーです。エラーが出てもあわてず、「どの値が処理に合っていないのか」を順番に見ていきましょう。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
記事URLをコピーしました