TypeError: unsupported operand type(s) for /: ‘str’ and ‘int’ の原因と対処法【Python】
先に結論です。Pythonでは文字列を割り算できません。+ は文字列どうしなら連結として動きますが、/ には文字列用の動作が用意されていません。だから 'a' / 'b' も '10' / 2 もエラーになります。割り算する前に数値へ変換してください。
このエラーが出るコード
price = input("金額を入力: ") # input() は必ず文字列を返す
print(price / 2)
Traceback (most recent call last):
File "t.py", line 2, in <module>
print(price / 2)
TypeError: unsupported operand type(s) for /: 'str' and 'int'
メッセージは「/ という演算子に、str型とint型の組み合わせは用意されていない」という意味です。型名の順番は、書いた順番どおりです。'10' / 2 なら 'str' and 'int'、10 / '2' なら 'int' and 'str' になります。
型の組み合わせで何が起きるか
| 書いたコード | 結果 |
|---|---|
'a' / 'b' |
TypeError: unsupported operand type(s) for /: 'str' and 'str' |
'10' / 2 |
TypeError: unsupported operand type(s) for /: 'str' and 'int' |
10 / '2' |
TypeError: unsupported operand type(s) for /: 'int' and 'str' |
10 / 2 |
5.0(正常。/ の結果は必ず小数) |
10 / 0 |
ZeroDivisionError: division by zero |
0で割った場合は別のエラーになります。詳しくはZeroDivisionErrorとはをご覧ください。
直し方
1. int() か float() で数値に変換する
いちばん確実な方法です。小数が入る可能性があるなら float() を使ってください。
price = input("金額を入力: ")
print(int(price) / 2) # 整数として読む
print(float(price) / 2) # 小数も受け付ける
int('1000円') は失敗します。数字以外が混ざっていると ValueError: invalid literal for int() になります。詳しくはPythonのValueErrorをご覧ください。
2. input() の直後に変換しておく
使う場所ごとに変換すると、変換し忘れが必ず出ます。受け取った瞬間に数値にしてしまうのが安全です。
price = float(input("金額を入力: ")) # ここで数値にする
print(price / 2)
print(price * 1.1)
3. 割る対象が本当に文字列でいいのか確認する
文字列を割りたい場面は、たいてい「分割したい」です。数値計算ではなく文字列操作なら、split() やスライスを使います。
s = "2026-09-24"
print(s.split("-")) # ['2026', '09', '24']
print(s[:4]) # '2026'
原因になりやすい3か所
| どこ | なぜ文字列になるか | 対策 |
|---|---|---|
input() |
必ず文字列を返す。数字を打っても文字列 | 受け取った直後に int() / float() |
| CSV・テキストファイルの読み込み | ファイルの中身はすべて文字列 | 読み込み時に変換する |
| JSON・APIのレスポンス | 送り手が数値を文字列で入れていることがある | type() で確認してから使う |
環境変数(os.environ) |
常に文字列 | int(os.environ["PORT"]) |
型を確認する方法
エラーが出たら、まず型を表示してください。推測より確実です。
print(type(price)) # <class 'str'> なら文字列
print(repr(price)) # '100' のように引用符が見えれば文字列
print(price) だと 100 と出るだけで型が分かりません。repr() を使うと引用符が見えるので一目で判別できます。
他の演算子でも同じことが起きる
| 演算子 | 'a' と 'b' |
'10' と 2 |
|---|---|---|
+ |
'ab'(連結できる) |
TypeError |
* |
TypeError: can't multiply sequence by non-int of type 'str' |
'1010'(繰り返しになる) |
- |
TypeError: unsupported operand type(s) for - |
TypeError |
/ |
TypeError |
TypeError |
// |
TypeError |
TypeError |
% |
書式指定として動く場合がある | 書式指定として動く場合がある |
+ と * と % だけが例外的に文字列で動きますこの表がエラーの分かりにくさの原因です。'10' * 2 は '1010' になってエラーになりません。気づかないまま計算結果だけがおかしくなるので、/ でエラーが出るのはむしろ親切だと考えてください。
+ の場合の詳細はTypeError: unsupported operand type(s) for +: ‘int’ and ‘str’で解説しています。
よくある質問
‘str’ and ‘int’ と ‘int’ and ‘str’ は何が違いますか
書いた順番が違うだけで、原因は同じです。左側が str なら左を、右側が str なら右を変換してください。
int()とfloat()はどちらを使うべきですか
小数が入る可能性があるなら float() です。int('3.5') は ValueError になりますが、float('3.5') は通ります。
変換すると今度はValueErrorが出ます
数字以外の文字が混ざっています。空白なら .strip()、カンマなら .replace(',', '') で取り除いてください。
s = " 1,234 "
print(float(s.strip().replace(",", ""))) # 1234.0
TypeErrorを事前に防ぐ方法はありますか
型ヒントを書いておくと、エディタが実行前に警告してくれます。実行時のチェックではありませんが、書いている最中に気づけます。
関連記事
TypeError全体はPythonのTypeError、エラー全般はPythonでよく出るエラー一覧にまとめています。
テックジムは月額22,000円の通い放題でプログラミング教室を運営しています。東京本校(永田町)では毎週土曜にゼロから始めるPython入門講座、そしてゼロから始めるClaude Code講座を無料で開いています。どちらも説明会ではなく実際に手を動かす講座です。
まとめ
TypeError: unsupported operand type(s) for /: は文字列を割り算しようとしたときに出ます。+ や * と違い、/ には文字列用の動作がありません。
原因のほとんどは input()・ファイル読み込み・環境変数など「見た目は数字、中身は文字列」です。受け取った直後に int() か float() で変換してください。迷ったら repr() で引用符の有無を確認します。





