TypeError: can only concatenate str (not "int") to str は、文字列(str)に、+ で数値(int)をつなごうとしたときのエラーです。 「str には str しかつなげません(int が来ました)」という意味です。

"合計: " + 100       # ← str + int

直し方は、数値を文字列にしてからつなぐか、f-string で書くかです。

直し方 書き方 結果
① f-string(おすすめ) f"合計: {100}円" 合計: 100円
② str() で変換 "合計: " + str(100) + "円" 合計: 100円
③ format "合計: {}円".format(100) 合計: 100円
(表示だけなら)print に並べる print("合計:", 100, "円") 合計: 100 円(間にスペース)

逆に、数値として計算したいのに、片方が文字列だった(input() の値など)なら、int() で数値に変換します。

確認環境:Python 3.10・3.14 で、エラー文と結果を確かめました。2つの版でエラー文は同じでした(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「can only concatenate strの直し方|Python」

エラー文の (not "○○") で、何をつないだか分かる

書いたコード エラー文
"合計: " + 100 can only concatenate str (not "int") to str
"税率" + 0.1 can only concatenate str (not "float") to str
"a" + None can only concatenate str (not "NoneType") to str
"a" + [1] can only concatenate str (not "list") to str
"a" + b"b" can only concatenate str (not "bytes") to str

not "NoneType" は、つなごうとした変数が None だったということです。関数の戻り値や dict.get() の結果が None になっていないかを確かめます。not "bytes" は、ファイルや通信から読んだデータを .decode("utf-8") で文字列にしていない形です。

逆向き(数値 + 文字列)はエラー文が違う

書いたコード エラー文
"合計: " + 100(str が左) can only concatenate str (not "int") to str
100 + "円"(int が左) unsupported operand type(s) for +: 'int' and 'str'
"5" - 3 unsupported operand type(s) for -: 'str' and 'int'
[1] + "a"(list が左) can only concatenate list (not "str") to list

どちらも原因は同じ「型が違うものを + でつないだ」です。左側の型によって、エラー文が変わります。

直し方① f-string(おすすめ)

price = 1200
tax = 0.1
print(f"{price:,}円 税込{price * (1 + tax):,.0f}円")
# 1,200円 税込1,320円

f-string は、{} の中に変数や計算を書くと、自動で文字列にして埋め込みます。 :, で3桁区切り、:.0f で小数を丸めるなど、表示の形も指定できます。書式の一覧は、既存の記事「Python f-string書式指定|全項目の早見表と実行結果・3.14対応」で扱っています。

直し方② str() で変換する

count = 3
msg = "件数" + str(count)       # '件数3'

join でも同じエラーの仲間が出る

",".join([1, 2])
# TypeError: sequence item 0: expected str instance, int found

",".join(map(str, [1, 2]))      # '1,2'

リストを join でつなぐときも、要素が数値だとエラーになります。 map(str, リスト) で、要素をすべて文字列にしてからつなぎます。

input() の値は、いつも文字列

a = input("1つ目: ")      # 5 と入力
b = input("2つ目: ")      # 3 と入力
print(type(a), a + b)
print(a + 1)
<class 'str'> 53
TypeError: can only concatenate str (not "int") to str

input() の値は、数字を入力しても文字列(str)です。 a + b は計算されず、"5" と "3" がつながって 53 になりました。a + 1 ではエラーになります。

a = int(input("1つ目: "))
b = int(input("2つ目: "))
print(a + b)        # 8

エラーにならずに 53 になるほうが、気づきにくい間違いです。CSV やフォームから読み込んだ値も、文字列のまま入っていることがあります。

int() で変換できない文字列

変換したい文字列 int() の結果
"12" 12
" 12 "(前後にスペース) 12(変換できた)
"12"(全角の数字) 12(変換できた)
"1,200"(カンマ付き) ValueError
"3.5"(小数) ValueError。float("3.5") なら 3.5

カンマ付きの金額は int(s.replace(",", "")) のように、カンマを取ってから変換します。 型の変換の一覧は、既存の記事「Python型変換まとめ|int・str・floatとValueError対処」で扱っています。

型を確かめる方法

x = input()
print(type(x))      # <class 'str'>
print(repr(x))      # '5'  ← 引用符が付いていれば文字列

print(x) だけでは、5 と '5' の区別がつきません。 type() か repr() で確かめると、文字列かどうかが分かります。

文字列の掛け算はエラーにならない

書いたコード 結果
"5" * 3 '555'(エラーにならない)
"5" + "3" '53'(エラーにならない)
"5" - 3 TypeError

* と + は、文字列どうしでも動くので、数値のつもりで計算すると、エラーにならずに違う結果になります。 計算結果がおかしいときは、type() で文字列が混ざっていないかを確かめます。

確認の手順(チェックリスト)

順番 確認すること 直し方
1 文字列を作りたいのか、計算したいのか 文字列 → f-string、計算 → int()
2 エラー文の not "○○" は何か NoneType なら None になった原因を探す
3 input()・CSV・フォームの値か int()・float() で変換
4 カンマ・小数を含むか replace(",", "")・float()
5 join のリストに数値があるか map(str, リスト)

よくある質問

Q. print("合計:", 100) と f-string の違いは何ですか。 A. print にカンマで並べると、間にスペースが入ります(合計: 100 円)。sep="" を付けるとスペースが入りません(合計:100円)。画面に表示するだけなら print で並べてもよく、文字列として保存・送信するなら f-string を使います。

Q. None をつないだエラーが出ました。 A. つないだ変数が None になった場所を探します。関連記事の「'NoneType' object has no attributeの直し方」で、None が返る代表的な例を扱っています。

まとめ

  • str に、+ で int・float・None などをつないだエラー
  • 直し方は f-string、str()、format
  • 100 + "円" のように数値が左だと、unsupported operand type(s) と表示される
  • input() の値は文字列。"5" + "3" は 53 になる
  • int("1,200")・int("3.5") は ValueError

参考・出典

確認日はいずれも 2026年10月11日です。

  • Python ドキュメント「Built-in Types」(文字列型 str):https://docs.python.org/3/library/stdtypes.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「can only concatenate strの直し方|Python」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?