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
Python 3 で確認

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
% 書式指定として動く場合がある 書式指定として動く場合がある
Python 3 で確認。+ と * と % だけが例外的に文字列で動きます

この表がエラーの分かりにくさの原因です。'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() で引用符の有無を確認します。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら