Tech カテゴリのイメージ

TypeError: unsupported operand type(s) for +: 'int' and 'str' の原因と直し方[Python]

Pythonを書き始めて最初に出会うエラーのひとつがこれになる。

TypeError: unsupported operand type(s) for +: 'int' and 'str'

順番が逆のこともある。

TypeError: can only concatenate str (not "int") to str

どちらも意味は同じで、数値と文字列を足そうとしている。Pythonは+を数値の加算にも文字列の連結にも使うが、混ぜることは許さない。

1. inputは常に文字列を返す

いちばん多い原因になる。

age = input("年齢: ")
print(age + 1) # TypeError

inputは入力を文字列として返す。数値として扱いたいなら明示的に変換する。

age = int(input("年齢: "))
print(age + 1)

小数ならfloatを使う。入力が数字とは限らないので、実際には失敗する場合の処理も要る。

try:
age = int(input("年齢: "))
except ValueError:
print("数字を入力してください")

数字に見えるのにint()が失敗する場合の話はcould not convert string to floatに書いた。

2. CSVやJSONから読んだ値が文字列のまま

ファイルから読んだ値は、見た目が数字でも文字列になっていることが多い。

with open("data.csv") as f:
for line in f:
name, score = line.strip().split(",")
total = total + score # TypeError

splitが返すのは文字列なので、変換が要る。

total = total + int(score)

pandasで読んだ場合は、列ごとの型を確認するのが早い。

print(df.dtypes)

objectになっている列は文字列が混ざっている可能性がある。数値に変換する。

df["score"] = pd.to_numeric(df["score"], errors="coerce")

errors="coerce"にすると、変換できない値は欠損になる。どこが変換できなかったかは、こう調べられる。

print(df[df["score"].isna()])

3. 文字列を作りたいのに数値が混ざっている

逆のパターンになる。メッセージを組み立てるときに起きる。

count = 5
print("残り" + count + "件") # TypeError

数値を文字列にするか、f-stringを使う。

print("残り" + str(count) + "件")
print(f"残り{count}件") # こちらが読みやすい

f-stringなら型を気にせず埋め込める。書式も指定できる。

price = 1234.5
print(f"価格は{price:,.0f}円") # 価格は1,235円

printに渡すだけなら、カンマで区切る手もある。

print("残り", count, "件") # 空白区切りで出力される

4. Noneが混ざっている

型名の部分がNoneTypeなら、値がNoneになっている。

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

辞書のgetが既定値を返した、関数がreturnに到達しなかった、といった原因になる。詳しくはNoneType object has no attributeに整理した。

total = total + (data.get("score") or 0)

5. リストと数値

リストに数値を足そうとした場合も同じ形で出る。

lst = [1, 2, 3]
print(lst + 4) # TypeError
print(lst + [4]) # OK。連結になる
lst.append(4) # 要素を足すならこちら

各要素に足したいならNumPyを使うか、内包表記で書く。

print([x + 4 for x in lst])

型を確認する

原因が読めないときは、足す直前で型を出す。

print(type(a), repr(a), type(b), repr(b))
c = a + b

reprを使うと'5'のようにクォート付きで表示されるので、文字列かどうかが一目で分かる。

📘 型の扱いを一度まとめて押さえるなら、独習Python

まとめ

+は数値の加算と文字列の連結を兼ねているが、混ぜられない
inputは必ず文字列を返す。数値として使うならintfloatで変換する
・ファイルから読んだ値も文字列。pandasならdtypesを確認しto_numericで変換する
・文字列を組み立てるならf-stringが読みやすく型も気にしなくてよい
NoneTypeが出たら、値がNoneになった原因を追う
・迷ったら足す直前にtype()repr()を出せば一発で分かる

※本記事にはアフィリエイト広告を含みます。