Pythonの型変換!int()・float()・str()とValueErrorの原因|Python基礎講座 第3回
前回:Pythonのデータ型の見分け方!int・float・str・boolをtype()で確認|Python基礎講座 第2回
「"120" と "198" を足したら 120198 になった…」「int() で変換したのに ValueError で止まる…」
型変換でつまずくのは、だいたいこの2つですよね。この記事は、Pythonの基本を1テーマずつ押さえる連載「Python基礎講座」の第3回です。前回はデータ型の見分け方を扱いました。今回はその続きとして、int()・float()・str() による型変換と、変換まわりで出るエラーの読み方を取り上げます。
対象はPythonを始めたばかりの初心者の方で、難易度は入門レベルです。変数と type() がわかれば読み進められます。動作確認は Python 3.13 で行いました。一緒に見ていきましょう! 😊
型変換とは?値の「種類」を作り直すこと

型変換とは、ある型の値をもとに、別の型の新しい値を作ることです。
イメージとしては、レシートに印刷された「120」を電卓に打ち直す作業です。紙の上の「120」は文字なので、そのままでは計算できません。電卓に打ち直して、はじめて足し算ができるようになりますよね。Pythonでは、この「打ち直し」を関数で行います。
| 関数 | 作る値 | 例 | 結果 |
|---|---|---|---|
int() |
整数(int) | int("120") |
120 |
float() |
小数(float) | float("0.75") |
0.75 |
str() |
文字列(str) | str(318) |
'318' |
ポイントは、元の変数は書き換わらないことです。int(apple) と書いても apple は文字列のまま。変換した結果を使いたいときは、そのまま計算に使うか、別の変数に入れます。
サンプル1:文字列の数を int() と float() で計算できるようにする
ファイルやキーボードから受け取った値は、見た目が数でも文字列になっていることがよくあります。レシートのメモを読み取った、という想定で試してみます。
# レシートのメモから読み取った値(ファイルや入力から来た値は文字列になりがち)
apple = "120"
milk = "198"
weight = "0.75" # kg
print(apple + milk) # 文字列のまま足すと…
# int() で整数に、float() で小数に変換してから計算する
total = int(apple) + int(milk)
print(total, type(total))
kg = float(weight)
print(kg * 1000, type(kg))

実行結果はこうなりました。
120198
318 <class 'int'>
750.0 <class 'float'>
ここが重要です👇
- 1行目の
120198は、"120"と"198"を文字としてつなげた結果です。エラーにならないぶん、気づきにくいのがやっかいなところです ⚠️ int(apple) + int(milk)のように変換してから足すと、ちゃんと318(int)になりました- 小数を含む
"0.75"はfloat()で変換します。1000を掛けた結果は750.0と、float のまま表示されます
サンプル2:数と文字列をつなぐときは str()
今度は逆向きです。計算した合計金額に「円」を付けて、値札の文字を作りたいとします。
total = 318
# 値札に表示する文字列を作りたい
label = total + "円"
print(label)
実行すると、エラーで止まりました(ファイルの場所は環境によって変わるので …\ と省略しています)。
Traceback (most recent call last):
File "…\s2_error.py", line 4, in <module>
label = total + "円"
~~~~~~^~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
最後の行の TypeError: unsupported operand type(s) for +: 'int' and 'str' は、「int と str の組み合わせでは + が使えません」という意味です。~~~~~~^~~~~~ の印も、+ の部分を指していますね。
前回の第2回では、"25" + 1 のように文字列が左のときに can only concatenate str (not "int") to str が出ました。同じ「型の組み合わせが合わない」エラーでも、左右の順番でメッセージが変わるのがおもしろいところです。どちらも、最後の行に出てくる 'int' や 'str' を見れば、どの型どうしがぶつかったのか読み取れます。
直し方は、str() で数を文字列にしてからつなげることです。
total = 318
# str() で数を文字列に変換してからつなげる
label = str(total) + "円"
print(label)
print("合計は" + label + "です")
# 変換した結果の型も確かめておく
print(type(str(total)), repr(str(total)))
318円
合計は318円です
<class 'str'> '318'
str(total)で318が文字列の'318'になり、「円」とつなげられましたrepr()で表示すると'318'とクォート付きになり、文字列になったことがはっきりわかります- ちなみに
f"合計は{total}円です"のような f文字列を使うと、str()を書かなくても数を文字の中に入れられます。f文字列は別の記事で詳しく扱っているので、ここでは「そういう書き方もある」くらいで大丈夫です
サンプル3:int() で ValueError が出る文字列を調べる
型変換でいちばん多いつまずきが、int() に渡した文字列が整数の形になっていないケースです。たとえば price = "3.5" を int(price) で変換すると、こうなりました。
Traceback (most recent call last):
File "…\s3_value_error.py", line 2, in <module>
print(int(price))
~~~^^^^^^^
ValueError: invalid literal for int() with base 10: '3.5'
invalid literal for int() with base 10: '3.5' は、「'3.5' は10進数の整数として読めません」という意味です。最後に読めなかった文字列そのものが表示されるので、ここを見れば原因の値がわかります。
では、どんな文字列なら通るのでしょうか。これ、実行せずに答えられますか? 8つの文字列を順番に int() に渡して試してみます。
# int() に渡すと、どれが通ってどれがエラーになる?
samples = ["42", " 42 \n", "42", "-7", "3.5", "1,200", "", "42円"]
for text in samples:
try:
print(repr(text), "→", int(text))
except ValueError as e:
print(repr(text), "→ ValueError:", e)

try: と except ValueError は、「エラーが出ても止まらずに次へ進む」ための書き方です。今回は結果を一覧で見るために使っているだけなので、形だけ眺めればOKです。実行結果はこちら。
'42' → 42
' 42 \n' → 42
'42' → 42
'-7' → -7
'3.5' → ValueError: invalid literal for int() with base 10: '3.5'
'1,200' → ValueError: invalid literal for int() with base 10: '1,200'
'' → ValueError: invalid literal for int() with base 10: ''
'42円' → ValueError: invalid literal for int() with base 10: '42円'
実際に動かしてみて、意外だった点をまとめるとこんな感じです👇
- 前後の空白や改行は無視される:
' 42 \n'も42になりました。入力の最後に改行が付いていても大丈夫です - 全角数字の
'42'も通る:これは少し驚きました。全角で入力されても整数にできます - 小数点・カンマ・単位が混ざるとエラー:
'3.5'、'1,200'、'42円'は ValueError です - 空の文字列
''もエラー:何も入力せずに Enter を押したときなどに起きます
'1,200' のようなカンマ付きの数は、カンマを取り除いてから変換する必要があります。文字列からカンマを消す方法は、この連載の第10回(文字列メソッド)で扱う予定です。
サンプル4:float を int にすると「切り捨て」になる
int() は小数(float)も整数に変換できます。ただし、四捨五入ではない点に注意です。1,000円を3人で割り勘する計算で確かめます。
# 1,000円を3人で割り勘する
per_person = 1000 / 3
print(per_person)
print(int(per_person)) # 小数点以下を切り捨てる
print(int(-2.7)) # マイナスは 0 に近い方へ
print(round(per_person)) # 四捨五入っぽく丸める
print(round(2.5), round(3.5)) # .5 のときは偶数の方に寄る
# 文字列の "3.9" を整数にしたいときは float() を通してから
print(int(float("3.9")))
333.3333333333333
333
-2
333
2 4
3
ポイントをまとめるとこんな感じです👇
int(333.333…)は333。小数点以下を切り捨てますint(-2.7)は-3ではなく-2でした。つまり「小さい方へ」ではなく「0 に近い方へ」切り捨てます- 四捨五入したいときは
round()を使います。ただしround(2.5)は3ではなく2、round(3.5)は4でした。ちょうど真ん中のときは偶数の方に丸める決まりになっています(公式ドキュメントの round() にも書かれています) - 文字列の
"3.9"を整数にしたいときは、int("3.9")だとサンプル3と同じ ValueError になります。int(float("3.9"))のようにいったん float を通すと3になりました
お金の計算で「切り捨て」と「四捨五入」を取りちがえると、合計が1円ずれたりします。どちらにしたいのかを決めてから、int() と round() を選ぶのがおすすめです。
サンプル5:bool() の変換は見た目どおりにならない
最後に、True / False を作る bool() です。設定ファイルから「メール通知するか」を読み込んだら、"False" という文字列だった…という場面を考えます。
# 設定ファイルから読んだ「メール通知するか」の値
notify = "False"
print(bool(notify)) # True と False、どっちが出る?
print(bool(""), bool("0"), bool(0), bool(0.0))
# 文字列で判定したいときは、文字列どうしで比べる
print(notify == "True")
True
False True False False
False
bool("False")は、なんとTrueでした。bool()は文字列の中身を読むのではなく、空かどうかだけを見ているためです- 2行目のとおり、
Falseになったのは空の文字列""と、数の0と0.0だけ。文字列の"0"は空ではないのでTrueです - 文字列で「True かどうか」を判定したいときは、
notify == "True"のように文字列どうしで比べるのが確実です。比較演算子は第6回で詳しく扱います
型変換で迷ったときのチェックリスト
| こうしたい | 書き方 | 注意点 |
|---|---|---|
| 文字列の整数で計算したい | int("120") |
小数点・カンマ・単位・空文字は ValueError |
| 文字列の小数で計算したい | float("0.75") |
結果は float になる |
| 数を文字とつなげたい | str(318) + "円" |
f文字列なら str() は不要 |
| 小数を整数にしたい | int(3.9) / round(3.9) |
int() は0に近い方へ切り捨て、round() は真ん中なら偶数寄り |
| 文字列の “3.9” を整数にしたい | int(float("3.9")) |
int("3.9") は ValueError |
| “True” / “False” の文字列を判定したい | text == "True" |
bool("False") は True になる |
エラーが出たら、まず最後の行のエラー名を見ます。TypeError なら「型の組み合わせが合わない」ので変換し忘れを疑い、ValueError なら「変換しようとした値の中身がおかしい」ので、メッセージの最後に出ている値を確かめましょう。
まとめ
- 型変換は別の型の新しい値を作ること。
int()・float()・str()を使い、元の変数は変わらない - 文字列の数どうしの
+は連結になる。計算する前にint()/float()で変換する - 数と文字列をつなぐときは
str()。忘れるとTypeError int()は前後の空白や全角数字はOK、小数点・カンマ・単位・空文字はValueError- float → int は 0 に近い方へ切り捨て。
round()はちょうど真ん中のとき偶数に丸める bool("False")はTrue。文字列の判定は== "True"で比べる
次回の第4回は、input() でキーボードから値を受け取る方法を取り上げます。今回の型変換がさっそく活躍しますよ。サンプル3の samples に自分で思いついた文字列を足して、int() が通るかどうか、ぜひ試してみてください! 🚀
\ 読んだら、次は自分で作ってみよう /
筆者が運営する無料の入門コース「作って学ぶPythonプログラミング入門」では、こうした基本文法を、割り勘計算機・おみくじ・数当てゲームなどを作りながら身につけます。各章末の定着ドリル(全42問)で、自分の手で書く練習まで。最初の4レッスンは登録なしで読めます。
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。




