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) # TypeErrorinputは入力を文字列として返す。数値として扱いたいなら明示的に変換する。
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 # TypeErrorsplitが返すのは文字列なので、変換が要る。
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 = 5print("残り" + count + "件") # TypeError数値を文字列にするか、f-stringを使う。
print("残り" + str(count) + "件")print(f"残り{count}件") # こちらが読みやすいf-stringなら型を気にせず埋め込める。書式も指定できる。
price = 1234.5print(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) # TypeErrorprint(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 + breprを使うと'5'のようにクォート付きで表示されるので、文字列かどうかが一目で分かる。
📘 型の扱いを一度まとめて押さえるなら、独習Python。
まとめ
・+は数値の加算と文字列の連結を兼ねているが、混ぜられない
・inputは必ず文字列を返す。数値として使うならintやfloatで変換する
・ファイルから読んだ値も文字列。pandasならdtypesを確認しto_numericで変換する
・文字列を組み立てるならf-stringが読みやすく型も気にしなくてよい
・NoneTypeが出たら、値がNoneになった原因を追う
・迷ったら足す直前にtype()とrepr()を出せば一発で分かる
※本記事にはアフィリエイト広告を含みます。