Pythonエラーを知ってエラーと友達になろう

# 概要
今回はPythonで出るエラーについてまとめていきたいと思います。

初学者の時は、エラーが出ると何から手をつければ良いかわからなくなる時はよくあると思います。

ググろうにもググり方がわからないという状況になって、エラーを極端に怖がってしまいます。

しかし、本来エラーはありがたいものなのです。

なぜかというと、どこかダメなのかを丁寧に教えてくれるので、慣れてくると良い友達のような感覚になります。

なのでこの記事を読んだ後はエラーを友達のように考えるようにしましょう！

それでは早速見ていきましょう！

# エラーが出た時の対策

まずはエラーが出た時の最初の対策を見ていきましょう。

1. まずは一番最後の行に出力されている「〜Error」の部分をみましょう。
2. 次にそのエラーがどんなものかを理解して、「〜Error」の後ろ部分をみてみましょう。
3. そこをみてもすぐに解決しない場合は、「〜Error」の後ろ部分をググってみましょう。（ここで気をつけるのが、パスや個人情報部分を取り除いてググってみてください。）
4. それでも解決しない時は、エラーを上に戻って、下にスクロールしながらエラーをみてみましょう。これでどこでエラーが出ているのか、どのようなエラーが出ているのかの細かい部分を見ることができます。
4. これでダメだったら質問投稿サイトなどで質問してみましょう！

# エラー一覧

エラーの対処法を確認したところで、早速エラーの種類の一覧を見ていきましょう！

## SyntaxError

「構文エラー」です。

「Pythonの構文に沿ってないよ！」怒られている状態です。

```python
print"かるでね")
         ^
SyntaxError: invalid syntax
```

この場合は「(」が足りていませんね。

矢印の部分を確認するとわかりやすいですが、今回はちょっとずれていますね…。

よくある「SyntaxError」の種類を紹介します。

クオーテーションのつけ忘れ。
「[]」や「()」の両方または、片方のつけ忘れ。
「=」と「==」の使い間違い。

## NameError
「名前」に対してのエラーです。

「こんな名前どこにも定義されていないよ！」と怒られています。

```python
----> 1 print(かるでね)

NameError: name 'かるでね' is not defined
```

「かるでね」という変数を定義していないのに、「かるでね」という変数を出力しようとしてしているために起こるエラーです。

エラーの部分の名前を定義するか、文字列にするなど、自分の状況に合わせて対処してください。

## IndentationError

「インデント」に対するエラーです。

「変なところにインデント入ってるよ？」というエラーです。

インデントがずれているために起こるエラーです。

```python
def prints():
    print("かるでね1")
     print("かるでね2")
    print("かるでね3")

print("かるでね2")
    ^
IndentationError: unexpected indent
```

「かるでね2」のインデントが１つずれているのが確認できますね。

単純にインデントを整えればエラーがなくなります。

## TypeError

「型」に対してのエラーです。

「いやいやその型でそれはできんよ。」と怒られています。

```python
cardene = 1234
for i in cardene:
    print(i)

      1 cardene = 1234
----> 2 for i in cardene:
      3     print(i)

TypeError: 'int' object is not iterable
```

「int型（数字型）」だから「for文」では回せないよと言われています。

「cardene」変数を文字列にするなどすれば問題なく出力できます。

## AttributeError

「属性」に関するエラーです。

「そんな属性ないよ？」と注意されています。

```python
import math
print(math.PI)

----> 3 print(math.PI)

AttributeError: module 'math' has no attribute 'PI'
```

「math.pi」というものはありますが、「math.PI」というものが存在しないために起こるエラーです。

単純にスペルミスを無くせば治せます。

```python
cardene = "かるでね"
cardene.append(100)

      1 cardene = "かるでね"
----> 2 cardene.append(100)

AttributeError: 'str' object has no attribute 'append'
```

## ModuleNotFoundError

「モジュール」に対するエラーです。

「そんなモジュールなくね？」と怒られています。

自分の環境に「pip」や「conda」でインストールできていないのにインポートしていたり、モジュールの名前を間違えたときに起こるエラーです。

```python
import cardene

----> 1 import cardene

ModuleNotFoundError: No module named 'cardene'
```

「cardene」というモジュールは存在しないので、適切なモジュールをインストールすれば解決します。

```python
cardene = "かるでね"
cardene.append(100)

----> 2 cardene.append(100)

AttributeError: 'str' object has no attribute 'append'
```

「cardene」という文字列に対して、「100」を付け足そうとしているのでエラーが起きています。

「cardene」をリストにすれば解決できます。

## ValueError

「型」に対しての「値」に関するエラーです。

「その値じゃ受け取れないよ〜」と怒られています。

```python
cardene = "かるでね"
print(int(cardene))

----> 2 print(int(cardene))

ValueError: invalid literal for int() with base 10: 'かるでね'
```

「cardene」は「かるでね」という文字が入っているので、数字に変換することはできないために起きているエラーです。

「かるでね」を「100」などに変更すれば解決します。

## ZeroDivisionError

「ゼロ」で割り算などをしたときに出るエラーです。

「ゼロで割っちゃいかんでしょ」と怒られています。

```python
print(100 / 0)

----> 1 print(100 / 0)

ZeroDivisionError: division by zero
```

「ゼロ」で割ってしまっているので、別の数字で割れば解決できます。

## ImportError

こちらも「モジュール」に対するエラーです。

「ファイル見てみたけど、そんなモジュールないよ？」と怒られています。

「from ~ import ~」で２つ目の「~」の部分が存在しないときに起こるエラーです。

```python
from tensorflow import cardene

ImportError: cannot import name 'cardene' from 'tensorflow' 
```

「tensorflow」というライブラリは存在しますが、「tensorflow」の中には「cardene」というモジュールが存在しないのでエラーが出ています。

「import」部分を存在する「モジュール」に変更すれば解決します。

## KeyError

「辞書」に指定の「キー」がないために起こるエラーです。

「そんなキーは存在しないよ？」と怒られています。

```python
cardene = {"cardene1": "cardene1", "cardene2": "cardene2", "cardene3": "cardene3"}
cardene["かるでね"]

----> 2 cardene["かるでね"]

KeyError: 'かるでね'
```

「cardene」という辞書には「かるでね」という「キー」が存在しないのが確認できます。

「“cardene1”」のように指定すれば解決します。

## IndexError
「リスト」などの「配列」で間違った「インデックス番号」を指定したときに起こるエラーです。

「そんなインデックス番号はないよ？」と怒られています。

```python
cardene = [1, 2, 3, 4, 5]
print(cardene[10])

----> 2 print(cardene[10])

IndexError: list index out of range
```

「cardene」という「リスト」は要素数が「５」なのに、「インデックス番号10番」にアクセスしようとしているのが確認できます。

「10」を「3」などに指定し直せば解決します。

## FileNotFoundError

「ファイル」が存在しないときに出るエラーです。

「君、存在しないファイルにアクセスしようとしてるよ」と言われています。

```python
with open('file.txt') as f:
    print(f.read())

----> 1 with open('file.txt') as f:
      2     print(f.read())

FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'
```

「file.txt」というファイルを開こうとしていますが、そんなファイルはないよと言われているのが確認できます。

「パス」や「ファイル名」を修正することで解決できます。

## FileExistsError

すでに存在しているファイルを作成しようとするときに起こるエラーです。

「もうそのファイル名は存在しているから作れんよ」と怒られています。

```python
import os
os.mkdir('cardene')

----> 3 os.mkdir('cardene')

FileExistsError: [Errno 17] File exists: 'cardene'
```

今回は「ディレクトリ」ですが、すでに存在しているよと言われているのが確認できます。

存在しない名前に変えたり、存在するファイルやディレクトリを削除することで解決できます。

# 最後に
今回はPythonで出るエラーについてまとめてきました。

結構色々な種類があって最初は混乱してしまいますが、何回も遭遇すると勝手に覚えてきます。

まずはどんなエラーがあるのかをこの記事で確認してもらって、エラーとどんどん仲良くなっていってください。

もしお友達になれるようなことがあれば報告してもらえると嬉しいです！

何か質問などがあれば下のTwitterのDMを送るか、ここのコメントで聞いてください！

それでは！