Python でのエラーが発生したときの対処方法を紹介していきます。
3ステップでエラーへの基本的な対処方法をマスターしましょう。
※ エラーは構文エラー(syntax error)と例外(exception)に区別されますが、この投稿では特に区別せず「エラー」として扱います。
目次
- エラー名、エラー内容、エラー位置を特定しよう
- SYNTAXERROR
- INDENTAIONERROR
- TYPEERROR
- NAMEERROR
- VALUEERROR
- ATTRIBUTEERROR
- INDEXERROR
- KEYERROR
- MODULENOTFOUNDERROR
- IMORTERROR
- FILENOTFOUNDERROR
[STEP1] エラー名、エラー内容、エラー位置を特定しよう
Pythonを実行してエラーが発生したときは、(1)エラーの名前、(2)エラーの具体的な内容、(3)エラーが発生した位置を確認しましょう。
この画像の例では、以下のようになります。
- エラー名: TypeError
意訳: データの型に関するエラーだよ - エラー内容: can only concatenate str (not “int”) to str
意訳: str(文字列)には、int(整数) ではなくstr(文字列)を連結することしかできませんよ - エラー位置: 2行目
このようにエラー名が分かればどの分野に関するエラーなのかが分かりますし、エラー内容を読めば何が間違っていたのかが大まかに分かるはずです。そのうえで、指定された位置にエラーの原因がないかを確かめて、修正していきます。
以降では、代表的なエラーとその対処方法を紹介していきます。
この基本的な流れを踏まえて、エラーに対処していきましょう。
[STEP2] 代表的なエラーとその対処方法を知ろう
1. 構文に関するエラー
SyntaxError
- エラー名: SytaxError
意訳: コードの構文や書き方が正しくないエラーだよ - エラー内容: incomplete input
意訳: 入力が不完全だよ - エラー位置: 1行目
SytaxErrorは、コードの構文や書き方が正しくない場合に発生するエラーです。
コロン:
や括弧()
の閉じ忘れなどでよく見られます。
対処方法:正しい構文に書き換える。
画像の例では、書き忘れた「 ) 」を入れれば修正完了です。
IndentationError
- エラー名: IndentationError
意訳: インデントが正しくないエラーだよ - エラー内容: incomplete input
意訳: 予期せぬインデントがあるよ - エラー位置: 3行目
IndentationErrorは、インデント(字下げ)が正しくない場合に発生するエラーです。
if文やfor文、関数内でインデントがズレているときによく見られます。
対処方法:インデントを正しい位置に揃える。
画像の例では、後ろにズレてしまった3行目のインデントを前に直せば修正完了です。
2. データの型や名前、値に関するエラー
TYPEERROR
- エラー名: TypeError
意訳: データ型が正しくないエラーだよ - エラー内容: incomplete input
意訳: 「-」に対して、int(整数) とstr(文字列)は対応していない変数のタイプだよ - エラー位置: 3行目
対処方法:正しいデータ型に修正する。
画像の例では、変数名SFCが”1990″と文字列になってしまっているので、「” “」を外して数値にすれば修正完了です。
NameError
- エラー名: NameError
意訳: 変数名が正しくないエラーだよ - エラー内容: name ‘KFC’ is not defined
意訳: KFCという名前は定義されていませんよ - エラー位置: 2行目
対処方法:正しい変数名を指定する。
画像の例では、定義されてないKFCという変数を呼び出そうとしているので、1行目で定義しているSFCに変えれば修正完了です。
ValueError
- エラー名: ValueError
意訳: 関数の引数に誤った型・値のデータを与えているエラーだよ - エラー内容: invalid literal for int() with base 10: ‘Shonan Fujisawa Campus’
意訳: 10進数にするint()に対して無効なリテラル(コードに直接記述された値)ですよ。Shonan Fujisawa Campusというのは。 - エラー位置: 2行目
対処方法:関数に処理可能な値を与える。
画像の例では、文字列を整数に変換してくれるint関数に対して、整数にできない”Shonan Fujisawa Campus”という文字列を与えてしまっています。”1990”や”1858”といった整数にできる値を与えましょう。
AttributeError
- エラー名: AttributeError
意訳: オブジェクトに対して、存在しない属性やメソッドを呼び出そうとしたエラーだよ - エラー内容: ‘int’ object has no attribute ‘append’
意訳:int(整数)型オブジェクトには、appendの属性はありませんよ - エラー位置: 2行目
対処方法: オブジェクトが有している属性やメソッドを呼び出す。
画像の例では、整数型オブジェクトであるkeioに対して、リストに要素を追加する際に用いるappend()メソッドを呼び出そうとしてしまっています。このメソッドの利用をやめるか、変数keioをメソッドが使えるリスト型に変更するなどしましょう。
3. インデックスやキーに関するエラー
IndexError
- エラー名: IndexError
意訳: リスト型などに要素数を超えたインデックスを指定したときのエラーだよ - エラー内容: list index out of range
意訳: リストのインデックスが範囲外だよ - エラー位置: 2行目
対処方法: 要素数内のインデックスを指定する。
画像の例では、campusのリストには6つの要素しか格納されていないのに対して、インデックス 10(0から数えるので11番目)の要素を呼び出そうとしてしまっています。0や5など、要素数内のインデックスに変更しましょう。
KeyError
- エラー名: KeyError
意訳: 辞書型のキーの指定を間違えたときのエラーだよ - エラー内容: ‘Tsuruoka’
意訳: Tsuruokaというキーは登録されてませんよ - エラー位置:2行目
対処方法: 登録されているキーを指定する。
画像の例では、辞書型のcampusに対して”Tsuruoka”という登録されていないキーを指定して値を呼び出そうとしてしまっています。”Mita”や”ShounanFujisawa”といった登録されているキーを指定し直すか、Tsuruokaというキーと対応する値を登録しましょう。
4. インポートに関するエラー
ModuleNotFoundError
- エラー名: ModuleNotFoundError
意訳: インポートしようとしたモジュールが見つからないときのエラーだよ - エラー内容: No module named ‘randamu’
意訳: randamuという名前のモジュールはありませんよ - エラー位置:1行目
対処方法: 正しいモジュール名を指定する。
画像の例では、恐らくrandomモジュール(疑似乱数を生成するモジュール)をインポートしようとして、randamuという間違った名前を指定してしまった様です。1, 2行目にあるrandamuをrandomという正しいモジュール名に変えれば修正完了です。
ImportError
- エラー名: ImportError
意訳: モジュールに含まれていないオブジェクトをインポートしようとしたときにでるエラーだよ - エラー内容: cannot import name ‘pai’ from ‘math’ (unknown location)
意訳: mathモジュールからはpaiという名前のオブジェクトをインポートすることはできませんよ - エラー位置:1行目
対処方法: 正しいオブジェクト名を指定する。
画像の例では、恐らくmathモジュール(数学関数を提供するモジュール)からpiオブジェクト(円周率)をインポートしようとして、paiという間違った名前を指定してしまった様です。1, 3行目にあるpaiをpiという正しいオブジェクト名に変えれば修正完了です。
5. ファイルやディレクトリに関するエラー
FileNotFoundError
- エラー名: FileNotFoundError
意訳: 指定されたファイルやディレクトリーが見つからないときのエラーだよ - エラー内容: [Errno 2] No such file or directory: ‘not_exist.csv’
意訳: not_exist.csvという名前のファイルまたはディレクトリーはありませんよ - エラー位置: 1行目
対処方法: 正しいファイルまたはディレクトリー名を指定する。
画像の例では、not_exist.csvという存在しないcsvファイルを開かせようとしてみました。存在するファイル名を指定し直せば修正完了です。
[STEP3] エラーの検索方法を知ろう
このページで紹介したエラーの中で見つけることができなかったときは、エラー名とエラー内容をコピペしてググれば、対処方法を見つけることができるかもしれません。
画像の例では、エラー名は「ZeroDivisionError」であり、エラー内容は「division by zero」です。これらをコピーして、「python ZeroDivisionError division by zero」でGoogle検索をすると……
エラーを解説するサイトがたくさんヒットするはずです。この例では、数字を0で割ってしまったため発生したエラーであったことが分かります。
また、エラーの対処方法を見つけやすくするために、ちょっとしたテクニックがあります。
画像の例では、エラー名は「FileExistsError」であり、エラー内容は「[Errno 17] File exists: ‘”jyouhoukisoshitsumonnsessyonn”’」です。これらをコピーして、「python FileExistsError [Errno 17] File exists: ‘”jyouhoukisoshitsumonnsessyonn”’」でYahoo検索をしてみると……
ヒットしませんでした。
ではここで、エラー内容の中にディレクトリの名前が含まれていると思いますが、これを除いて「python FileExistsError [Errno 17] File exists」で検索してみると…..
先程と変わってエラーを解説するサイトがたくさんヒットし、ファイルやディレクトリを作成する際のエラーであることが分かります。(注意:例を示すためにかなり特殊なディレクトリ名にしています。実際の場合はヒットする可能性もあります。)
そのコード特有の名前である関数名や変数名、ファイル名、ディレクトリ名を除いて検索するとよりヒットしやすくなります。