【Python】int型の変換でエラーになる原因と対処法

Pythonでプログラムを作成する際、文字列や他のデータ型を整数(int型)に変換することがよくあります。

しかし、変換がうまくいかないとエラーが発生し、プログラムが停止してしまいます。

このエラーの原因と対処法を知っておくことで、プログラムの信頼性を高めることができます。

本記事では、int型変換で発生する主なエラーの種類とその対処法について、具体的な例を交えてわかりやすく解説します。

目次から探す

int型変換で発生するエラーの種類

Pythonでint型に変換する際に発生するエラーには主にValueErrorとTypeErrorの2種類があります。

これらのエラーは、変換しようとするデータが適切でない場合に発生します。

以下では、それぞれのエラーの詳細と具体的な例を見ていきましょう。

ValueError

ValueErrorは、無効な値をint型に変換しようとしたときに発生します。

具体的には、非数値文字列や空文字列をint型に変換しようとすると、このエラーが発生します。

非数値文字列の変換

非数値文字列をint型に変換しようとすると、ValueErrorが発生します。

例えば、以下のコードを見てください。

value = "abc"
int_value = int(value)

このコードを実行すると、次のようなエラーが発生します。

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

このエラーは、文字列abcが数値に変換できないために発生します。

空文字列の変換

空文字列をint型に変換しようとした場合も、ValueErrorが発生します。

以下のコードを見てください。

value = ""
int_value = int(value)

このコードを実行すると、次のようなエラーが発生します。

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

空文字列は数値に変換できないため、このエラーが発生します。

TypeError

TypeErrorは、無効な型のオブジェクトをint型に変換しようとしたときに発生します。

具体的には、Noneやリスト、辞書などをint型に変換しようとすると、このエラーが発生します。

Noneの変換

Noneをint型に変換しようとすると、TypeErrorが発生します。

以下のコードを見てください。

value = None
int_value = int(value)

このコードを実行すると、次のようなエラーが発生します。

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

Noneは数値に変換できないため、このエラーが発生します。

リストや辞書の変換

リストや辞書をint型に変換しようとした場合も、TypeErrorが発生します。

以下のコードを見てください。

value = [1, 2, 3]
int_value = int(value)

このコードを実行すると、次のようなエラーが発生します。

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

リストは数値に変換できないため、このエラーが発生します。

同様に、辞書を変換しようとした場合もエラーが発生します。

value = {"key": "value"}
int_value = int(value)

このコードを実行すると、次のようなエラーが発生します。

TypeError: int() argument must be a string, a bytes-like object or a number, not 'dict'

辞書も数値に変換できないため、このエラーが発生します。

以上が、int型変換で発生する主なエラーの種類とその具体例です。

次のセクションでは、これらのエラーの原因と対処法について詳しく解説します。

エラーの原因と対処法

ValueErrorの対処法

文字列の検証

ValueErrorは、数値に変換できない文字列をint関数に渡したときに発生します。

このエラーを防ぐためには、まず文字列が数値であるかどうかを検証する必要があります。

以下は、文字列が数値であるかどうかを確認する簡単な方法です。

user_input = "123a"
if user_input.isdigit():
    number = int(user_input)
    print(f"変換成功: {number}")
else:
    print("エラー: 数値に変換できない文字列です")

このコードでは、isdigitメソッドを使用して文字列が数字のみで構成されているかを確認しています。

数字のみであればint関数で変換し、そうでなければエラーメッセージを表示します。

正規表現を使った検証

より複雑な検証が必要な場合は、正規表現を使用することができます。

例えば、負の数や小数点を含む数値を検証する場合です。

import re
user_input = "-123.45"
if re.match(r'^-?\d+(\.\d+)?$', user_input):
    number = float(user_input)
    print(f"変換成功: {number}")
else:
    print("エラー: 数値に変換できない文字列です")

このコードでは、正規表現を使用して文字列が負の数や小数点を含む数値であるかを確認しています。

正規表現r'^-?\d+(\.\d+)?$'は、負の符号、数字、小数点を含む数値を検出します。

TypeErrorの対処法

Noneのチェック

TypeErrorは、Noneや他の非数値型のオブジェクトをint関数に渡したときに発生します。

このエラーを防ぐためには、まず変換対象がNoneでないことを確認する必要があります。

value = None
if value is not None:
    number = int(value)
    print(f"変換成功: {number}")
else:
    print("エラー: Noneは数値に変換できません")

このコードでは、Noneでないことを確認してからint関数を使用しています。

データ型の確認

リストや辞書などの非数値型のオブジェクトをint関数に渡すとTypeErrorが発生します。

このエラーを防ぐためには、変換対象のデータ型を確認する必要があります。

value = [1, 2, 3]
if isinstance(value, (int, float, str)):
    number = int(value)
    print(f"変換成功: {number}")
else:
    print("エラー: リストや辞書は数値に変換できません")

このコードでは、isinstance関数を使用して変換対象が整数、浮動小数点数、または文字列であるかを確認しています。

これにより、リストや辞書などの非数値型のオブジェクトが渡された場合にエラーメッセージを表示します。

以上の方法を使用することで、int型への変換時に発生するエラーを効果的に防ぐことができます。

実践例

ユーザー入力の検証

ユーザーからの入力を受け取る際には、入力が数値であることを確認する必要があります。

以下の例では、ユーザーに数値を入力させ、その入力が有効な整数であるかを検証します。

# ユーザーに入力を求める
user_input = input("整数を入力してください: ")
# 入力が整数かどうかを確認する
try:
    user_number = int(user_input)
    print(f"入力された整数は {user_number} です。")
except ValueError:
    print("入力が無効です。整数を入力してください。")

このコードでは、input関数でユーザーからの入力を受け取り、それをint関数で整数に変換しようとします。

変換に失敗した場合、ValueErrorが発生し、エラーメッセージが表示されます。

ファイルからのデータ読み込みと変換

ファイルからデータを読み込む場合も、データが整数であることを確認する必要があります。

以下の例では、テキストファイルから数値を読み込み、それを整数に変換します。

# ファイルからデータを読み込む
with open('numbers.txt', 'r') as file:
    lines = file.readlines()
# 各行を整数に変換する
for line in lines:
    line = line.strip()  # 改行文字を削除
    try:
        number = int(line)
        print(f"読み込んだ整数は {number} です。")
    except ValueError:
        print(f"無効なデータ: {line}")

このコードでは、numbers.txtというファイルからデータを読み込み、各行を整数に変換しようとします。

変換に失敗した場合、ValueErrorが発生し、エラーメッセージが表示されます。

APIからのデータ取得と変換

APIからデータを取得する場合も、データが整数であることを確認する必要があります。

以下の例では、APIからデータを取得し、それを整数に変換します。

import requests
# APIからデータを取得する
response = requests.get('https://api.example.com/data')
data = response.json()
# データを整数に変換する
try:
    number = int(data['number'])
    print(f"APIから取得した整数は {number} です。")
except (ValueError, KeyError):
    print("無効なデータが取得されました。")

このコードでは、requestsライブラリを使用してAPIからデータを取得し、そのデータを整数に変換しようとします。

変換に失敗した場合、ValueErrorKeyErrorが発生し、エラーメッセージが表示されます。

以上のように、ユーザー入力、ファイルからのデータ読み込み、APIからのデータ取得の各場面で、データが整数であることを確認する方法を紹介しました。

これらの方法を活用することで、int型の変換エラーを防ぐことができます。

目次から探す