ValueErrorとは?Pythonで発生する原因・対処法・TypeErrorとの違いを解説

Pythonでプログラムを書いていると、突然
ValueError: invalid literal for int() with base 10: 'abc'
のようなエラーが表示されることがあります。
これはPythonでよく出るエラーの一つであるValueError(バリューエラー)です。
ValueErrorは、関数や処理そのものは正しいものの、渡された値が想定されていない場合に発生します。
本記事では、ValueErrorの意味から具体的な発生例、原因、対処法、TypeErrorとの違いまで、Python初心者にも分かりやすく解説します。
ValueErrorとは?
ValueErrorとは、値の型は適切でも、その値の内容が適切ではない場合に発生する例外です。
Pythonでは、次のように説明できます。
「この型の値は受け取れるけれど、その値の内容では処理できません」
例えば、文字列を整数に変換するint()を考えてみましょう。
num = int("100")
print(num)
これは問題ありません。
"100"という文字列は整数に変換できるからです。
一方、次のコードではValueErrorが発生します。
num = int("abc")
実行すると、次のようなエラーになります。
ValueError: invalid literal for int() with base 10: 'abc'
int()は文字列を受け取れますが、"abc"は整数として解釈できません。
このような場合にValueErrorが発生します。
ValueErrorが発生する代表的なケース
ValueErrorは、Pythonのさまざまな処理で発生します。
代表的なケースを見てみましょう。
1. 文字列を整数に変換できない
最も分かりやすい例です。
num = int("Python")
実行すると、
ValueError: invalid literal for int() with base 10: 'Python'
となります。
int()は整数に変換できる文字列を必要とします。
num = int("123")
print(num)
なら正常に動作します。
2. float()で数値に変換できない
float()でもValueErrorが発生することがあります。
price = float("abc")
この場合、
ValueError: could not convert string to float: 'abc'
のようなエラーが発生します。
一方、
price = float("1980.5")
print(price)
であれば、
1980.5
と変換できます。
3. list.index()で存在しない値を検索する
リストのindex()でもValueErrorが発生します。
numbers = [10, 20, 30]
print(numbers.index(40))
リストの中に40が存在しないため、
ValueError: 40 is not in list
となります。
この場合は、検索する前にinで存在確認する方法があります。
numbers = [10, 20, 30]
if 40 in numbers:
print(numbers.index(40))
4. リストから要素を削除する
remove()でもValueErrorが発生することがあります。
numbers = [10, 20, 30]
numbers.remove(40)
40がリストに存在しないため、
ValueError: list.remove(x): x not in list
となります。
存在することを確認してから削除できます。
if 40 in numbers:
numbers.remove(40)
5. 日付の変換でValueErrorが発生する
日付を扱う場合にもValueErrorはよく発生します。
例えば、
from datetime import datetime
date = datetime.strptime("2026/13/01", "%Y/%m/%d")
「13月」は存在しないため、ValueErrorになります。
正しい日付であれば、
date = datetime.strptime("2026/09/01", "%Y/%m/%d")
print(date)
のように処理できます。
ValueErrorとTypeErrorの違い
Python初心者が混同しやすいのが、ValueErrorとTypeErrorの違いです。
簡単に整理すると、次のようになります。
| エラー | 原因 |
|---|---|
| ValueError | 型は適切だが、値が不適切 |
| TypeError | 型そのものが不適切 |
例えば、
int("100")
は文字列を整数に変換しています。
文字列という型自体はint()に渡せるため、正常に動作します。
しかし、
int("abc")
では値の内容が不適切なのでValueErrorになります。
一方、
int([100])
のようにリストを渡すと、型が適切ではないためTypeErrorになります。
ValueError
int("abc")
→ 値が不適切
TypeError
int([100])
→ 型が不適切
この違いを理解すると、エラーの原因を特定しやすくなります。
ValueErrorが発生したときの対処法
ValueErrorを解決するには、まずエラーメッセージを読むことが重要です。
例えば、
ValueError: invalid literal for int() with base 10: 'abc'
なら、
int("abc")
のような処理が原因だと考えられます。
対処法1:変換前の値を確認する
ValueErrorの原因を調べるには、まず変数の中身を確認します。
value = input("数字を入力してください:")
print(value)
例えばユーザーが、
abc
と入力していた場合、
int(value)
でValueErrorが発生します。
対処法2:try-exceptを使う
ValueErrorが発生する可能性がある処理では、try-exceptを使用できます。
try:
num = int(input("数字を入力してください:"))
print(num)
except ValueError:
print("整数を入力してください。")
例えば、
数字を入力してください:abc
と入力しても、プログラムが停止せず、
整数を入力してください。
と表示できます。
ValueErrorをexceptで処理する
ValueErrorだけを捕捉する場合は、次のように記述します。
try:
value = int("abc")
except ValueError:
print("数値への変換に失敗しました")
このように発生する可能性のある例外を具体的に指定することが重要です。
次のようにすべての例外を捕捉することもできます。
try:
value = int("abc")
except Exception:
print("エラーが発生しました")
ただし、初心者のうちは何でもExceptionで捕捉するより、ValueErrorなど具体的な例外を指定するほうが原因を把握しやすくなります。
ValueErrorを防ぐには?
ValueErrorを防ぐためには、処理する前に値をチェックすることが有効です。
例えば、整数を入力してもらう場合です。
value = input("数字を入力してください:")
if value.isdigit():
num = int(value)
print(num)
else:
print("数字を入力してください")
isdigit()を使うことで、文字列が数字として扱えるかを確認できます。
ただし、-10や3.14などはisdigit()だけでは適切に判定できないため、実際のアプリケーションではtry-exceptを使う方法も有力です。
ValueErrorが発生したコードを確認するポイント
ValueErrorが発生したら、次のポイントを確認しましょう。
1. エラーが発生した行を確認する
例えば、
ValueError: invalid literal for int() with base 10: 'abc'
と表示されている場合、まずint()を使用している箇所を探します。
2. 変数の中身を確認する
print(value)
などを使って、実際にどのような値が入っているか確認します。
3. 型を確認する
print(type(value))
を使うと、変数の型を確認できます。
例えば、
value = "100"
print(type(value))
なら、
<class 'str'>
と表示されます。
4. 関数が受け取れる値か確認する
例えば、
int(value)
なら、valueの内容が整数として解釈できるか確認します。
NumPyやPandasでもValueErrorは発生する
ValueErrorはPython標準機能だけでなく、NumPyやPandasなどのライブラリでも発生します。
例えばNumPyでは、配列の形状が合わない場合などにValueErrorが発生することがあります。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5])
result = a + b
処理内容によっては、
ValueError
が発生します。
これは、配列のサイズや形状が期待される条件を満たしていないことが原因です。
そのため、ValueErrorが出たからといって、必ずしも「文字列を数値に変換したこと」が原因とは限りません。
値やデータの条件が想定と違う場合に幅広く発生するエラーと理解しておくとよいでしょう。
ValueErrorの原因を特定するコツ
ValueErrorを解決するときは、次の順番で確認すると効率的です。
① エラーメッセージを読む
↓
② エラーが発生した行を確認
↓
③ 使用している変数の中身を確認
↓
④ type()で型を確認
↓
⑤ 関数が要求する値の条件を確認
↓
⑥ 必要に応じてtry-exceptを使用
特に重要なのは、エラーメッセージを最初から読むことです。
Pythonのエラーメッセージには、原因を推測するための情報が含まれています。
ValueErrorを理解するとPythonのデバッグが楽になる
ValueErrorは、Python初心者が遭遇しやすいエラーの一つです。
しかし、意味を理解してしまえば、それほど難しいエラーではありません。
ポイントは、
「型は合っているが、値が想定外」
ということです。
例えば、
int("123")
は正常ですが、
int("abc")
はValueErrorになります。
また、
numbers = [1, 2, 3]
numbers.remove(10)
のように、指定した値が存在しない場合にもValueErrorが発生します。
まとめ:ValueErrorは「値が不適切」なときに発生する
ValueErrorについて、最後にポイントを整理します。
-
ValueErrorはPythonの代表的な例外の一つ
-
型は適切でも値が不適切な場合に発生する
-
int()やfloat()などの型変換でよく発生する -
list.index()やlist.remove()でも発生する -
日付処理などでも発生する
-
NumPyやPandasでも発生する
-
type()やprint()で値・型を確認すると原因を特定しやすい -
try-exceptでValueErrorを適切に処理できる -
TypeErrorは「型が不適切」、ValueErrorは「値が不適切」と覚えると分かりやすい
PythonでValueErrorが発生したら、まず「この処理に対して、渡している値は本当に適切なのか?」を確認してみましょう。
FAQ:ValueErrorに関するよくある質問
Q1. ValueErrorとは何ですか?
ValueErrorは、関数や処理が受け取れる型ではあるものの、値の内容が適切ではない場合に発生する例外です。
Q2. ValueErrorとTypeErrorの違いは?
ValueErrorは「値が不適切」、TypeErrorは「型が不適切」という違いがあります。
int("abc")
は値が不適切なのでValueErrorです。
一方、
int([1, 2, 3])
のように適切ではない型を渡すとTypeErrorになります。
Q3. ValueErrorはどうやって直しますか?
まずエラーが発生した行とエラーメッセージを確認し、処理に渡している値を確認します。
必要に応じて、
try:
...
except ValueError:
...
を使って例外処理を行います。
Q4. ValueErrorはPython初心者によくあるエラーですか?
はい。特にinput()で受け取った文字列をint()やfloat()に変換する処理では、初心者にも頻繁に発生します。
Q5. ValueErrorとExceptionの関係は?
ValueErrorはPythonの例外クラスの一つです。
そのため、
except ValueError:
のように、ValueErrorだけを対象として例外処理できます。
詳しくはTypeErrorとは?原因・よくあるエラー例・解決方法を初心者向けに解説で解説しています。
他のPythonエラーの原因と対処法はPythonエラー一覧と対処法に種類別でまとめています。エラーメッセージの読み方もあわせて解説しています。





