閉じる

【Python】よくあるエラー原因ランキングとエラーメッセージの読み方入門

Pythonを始めたばかりの頃は、画面いっぱいに表示される英語のエラーメッセージに圧倒されてしまいがちです。

  1. 一番下の行でエラーの種類と理由を確認する
    例:ZeroDivisionError: division by zero
  2. そのすぐ上のブロックでエラーが実際に起きた行を確認する
    例:File "error_example.py", line 3, in divide
  3. さらにその上の行でどこからその関数が呼ばれたかをたどる
    例:main()divide(x, y) という呼び出し関係

しかし、エラーは決して敵ではなく、プログラムが「ここがおかしいよ」と教えてくれる大切なヒントです。

本記事では、Pythonのエラーメッセージの読み方の基本から、よくあるエラー原因ランキング、そしてエラーと上手に付き合うための習慣までを、図解や具体例を交えながら丁寧に解説します。

Pythonのエラーメッセージの基本の読み方

Pythonエラーの種類

Pythonのエラーは、大きく分けると次の2種類があります。

1つ目は「構文エラー(SyntaxErrorなど)」で、コードの書き方そのものがPythonの文法ルールに反している場合に出るエラーです。

2つ目は「実行時エラー(例外: Exception)」で、文法は正しいけれど、実際に実行してみたときに値の状態や処理内容の問題によって発生するエラーです。

構文エラー(Syntax系)とは

構文エラーは、Pythonがコードを「翻訳」している段階で発見されます。

例えば、カンマの付け忘れや括弧の閉じ忘れ、インデントのずれなどです。

Python
# 構文エラーの例(SyntaxError)
numbers = [1, 2, 3  # 右側の角かっこ ] が抜けている

print(numbers)

このような場合、Pythonはプログラムを実行する前に「そもそも意味が解読できない」と判断し、SyntaxErrorとしてエラーを出します。

実行時エラー(例外: Exception)とは

一方、実行時エラーは、文法的には正しいコードでも、実際に動かしたときにだけ見つかる問題です。

例えば、0で割ろうとしたり、存在しないファイルを開こうとしたりしたときです。

Python
# 実行時エラーの例(ZeroDivisionError)
x = 10
y = 0
result = x / y  # 0で割っているので実行時にエラー

print(result)

このようなエラーは、ZeroDivisionErrorFileNotFoundErrorなど、原因に応じた例外名が付いて表示されます。

トレースバック(traceback)の見方と読む順番

Pythonでエラーが起きると、「Traceback (most recent call last):」から始まるメッセージが表示されます。

これをトレースバック(traceback)と呼びます。

トレースバックは、「どのファイルの」「どの行で」「どんな種類のエラーが」「どんな理由で」起きたかを教えてくれる履歴です。

読む順番にはコツがあり、基本的には一番下から上に向かって読んでいきます。

トレースバックの構造

次のような簡単な例を見てみます。

Python
# error_example.py

def divide(a, b):
    return a / b  # ここで0除算の可能性

def main():
    x = 10
    y = 0
    print(divide(x, y))

main()

これを実行すると、次のようなトレースバックが表示されます。

実行結果
Traceback (most recent call last):
  File "error_example.py", line 9, in <module>
    main()
  File "error_example.py", line 6, in main
    print(divide(x, y))
  File "error_example.py", line 3, in divide
    return a / b
ZeroDivisionError: division by zero

トレースバックは上から順に「呼び出しの歴史」が並んでいて、一番下にエラーの種類と理由が表示されています。

読む順番のポイント

トレースバックを読むときは、次の順番を意識します。

  1. 一番下の行でエラーの種類と理由を確認する
    例:ZeroDivisionError: division by zero
  2. そのすぐ上のブロックでエラーが実際に起きた行を確認する
    例:File "error_example.py", line 3, in divide
  3. さらにその上の行でどこからその関数が呼ばれたかをたどる
    例:main()divide(x, y) という呼び出し関係

最初から全部を細かく読む必要はなく、まず「一番下の2〜3行」をしっかり読むことが大切です。

エラーメッセージで確認すべき3つのポイント

エラーメッセージを読むときに、最低限おさえておきたいのは次の3点です。

  1. エラーの種類(例外名)
  2. エラーの説明文
  3. ファイル名と行番号

この3つを組み合わせて読むことで、原因にかなり近づくことができます。

1. エラーの種類(例外名)

エラーの種類は、トレースバックの一番下にあるZeroDivisionErrorSyntaxErrorなどの部分です。

これは「どんなタイプの問題か」を表しています。

例えば、

  • SyntaxError なら「文法が間違っている」
  • NameError なら「その名前の変数や関数は知らない」
  • TypeError なら「その型の値にその操作はできない」

といった大まかな傾向がわかります。

2. エラーの説明文

例外名の後ろに続く英語の文章は、「もう少し具体的な理由」を教えてくれます。

例えば、次のようなものです。

  • SyntaxError: invalid syntax
  • NameError: name 'x' is not defined
  • TypeError: can only concatenate str (not "int") to str

ここにはトラブルシューティングに直結するヒントが書かれているので、可能な範囲で読解するようにします。

3. ファイル名と行番号

トレースバックの各ブロックの先頭には、次のような情報が並んでいます。

実行結果
File "example.py", line 10, in <module>

これは、どのファイルの何行目でエラーが起きたかを教えてくれます。

エディタでその行を開き、前後のコードも含めて確認することで、原因を特定しやすくなります。

英語のエラーメッセージを読むコツと最低限の単語

Pythonのエラーメッセージは基本的に英語ですが、全部を完璧に読めなくても大丈夫です。

まずはよく出る単語だけを拾うところから始めると、だんだん慣れてきます。

よく出てくる単語と意味を、表にまとめます。

英単語・表現意味のイメージ
invalid無効な、おかしな
unexpected予期しない、想定外の
not defined定義されていない
not found / No such file見つからない、そのようなファイルはない
division by zero0で割ろうとした
out of range範囲外
indexインデックス(位置、番号)
key辞書のキー
type
attribute属性(オブジェクトの持つ値やメソッド)

例えば、NameError: name 'foo' is not defined であれば、namenot defined が読めれば、「fooという名前のものが定義されていないんだな」と推測できます。

すべての単語を辞書で調べる必要はなく、「エラーの種類」「not〜」「found」「invalid」などのキーワードだけを拾って原因を推測する姿勢が大切です。

Pythonでよくあるエラー原因ランキング

ここからは、Python初心者が特によく遭遇するエラーをランキング形式で解説します。

それぞれのエラーについて、発生しやすい典型パターンと、トレースバックの読み方をセットで理解すると、実務や学習でのつまずきが減っていきます。

第1位: SyntaxError

SyntaxErrorは、Python初心者が最も頻繁に遭遇するエラーです。

文法のどこかがPythonのルールに従っていないときに発生します。

代表的なSyntaxErrorの例

Python
# 1. コロン: の付け忘れ
if x > 0  # ← 本来は末尾に : が必要
    print("positive")

# 2. カッコの閉じ忘れ
print("Hello"  # ← ) が抜けている

# 3. クォートの閉じ忘れ
message = "Hello  # ← " が閉じられていない

これらを実行すると、次のようなメッセージになります。

実行結果
  File "example.py", line 2
    if x > 0
            ^
SyntaxError: invalid syntax

上の例では、^ の位置に注目します。

Pythonが「おかしい」と感じた位置を示してくれる記号です。

ただし、実際の原因は少し前にあることも多いので、その行の前後も確認するようにします。

SyntaxErrorの対処のコツ

SyntaxErrorが出たときは、次の順番で確認するとよいです。

  1. エラーメッセージのline Xで該当行を開く
  2. その行だけでなく、直前の行も確認する
  3. カンマ,、コロン:、括弧()[]{}、クォート'"の対応関係をチェック

特に「前の行の末尾にカンマや括弧が足りない」のは、非常によくあるパターンです。

第2位: NameError

NameErrorは、「その名前の変数・関数・クラスなどは知らない」というエラーです。

NameErrorが起きる典型パターン

Python
# 1. スペルミス
user_name = "Alice"
print(user_nmae)  # ← スペルミス

# 2. 定義前に使ってしまう
print(count)  # ここで使おうとしているが
count = 10    # 定義は後ろ
実行結果
NameError: name 'user_nmae' is not defined

このエラーメッセージは、'user_nmae' という名前が定義されていないと教えてくれています。

NameErrorの対処のコツ

NameErrorが出たら、次の点を確認します。

  • 変数名・関数名のスペルが完全に一致しているか
  • 定義よりも前で参照していないか
  • 関数やクラスのスコープ(有効範囲)の外から参照していないか

名前をコピーペーストして比較したり、エディタの「名前の一括置換」機能を使うと、スペルミスを防ぎやすくなります。

第3位: TypeError

TypeErrorは、「その型の値に対して、その操作はできない」ときに発生します。

よくあるTypeErrorの例

Python
# 文字列と整数の足し算
age = 20
message = "I am " + age + " years old"  # ここでTypeError

print(message)

実行すると、次のようなエラーになります。

実行結果
TypeError: can only concatenate str (not "int") to str

これは直訳すると「文字列(str)だけを連結できます(整数intはダメ)」という意味です。

つまり、文字列と整数をそのまま+でつなぐことはできないということです。

対処方法の例

上記のコードは、整数を文字列に変換すれば解決します。

Python
age = 20
# int を str に変換してから連結する
message = "I am " + str(age) + " years old"

print(message)
実行結果
I am 20 years old

TypeErrorが出たときは、「この演算子(+, -, *, / など)やこの関数は、どの型の値に対して使えるのか」を確認することが重要です。

第4位: AttributeError

AttributeErrorは、「そのオブジェクトは、その名前の属性(メソッドや変数)を持っていない」というエラーです。

AttributeErrorの典型例

Python
text = "hello"
text.append("!")  # 文字列にappendメソッドはない

実行すると、次のようなエラーが出ます。

実行結果
AttributeError: 'str' object has no attribute 'append'

メッセージを分解すると、「'str' object (文字列オブジェクト)には、'append' という属性はない」と言っています。

対処の考え方

AttributeErrorが出た場合は、次のどちらかの可能性を考えます。

  1. その型に存在しないメソッド・属性を呼び出している
    例: 文字列にappendしようとしている
  2. 本当は別の型を想定していたのに、別物が入っている
    例: リストだと思っていた変数が、実はNoneだった

Pythonの公式ドキュメントやエディタの補完機能で、「その型にどんなメソッドがあるか」を確認する習慣をつけておくと、AttributeErrorは減っていきます。

第5位: IndexErrorとKeyError

IndexErrorとKeyErrorは、どちらも「存在しない位置(または名前)を指定した」ときに発生するエラーです。

IndexErrorの例(リストなど)

Python
numbers = [10, 20, 30]
print(numbers[3])  # インデックスは 0,1,2 までしかない
実行結果
IndexError: list index out of range

out of rangeは「範囲外」という意味で、リストの長さに対して大きすぎるインデックスを指定したことを表しています。

KeyErrorの例(辞書)

Python
user = {"name": "Alice"}
print(user["age"])  # "age" というキーは存在しない
実行結果
KeyError: 'age'

KeyErrorでは、存在しないキーの名前がメッセージに表示されます。

対処のコツ

IndexErrorやKeyErrorが出た場合は、次の点を確認します。

  • リストやタプルなどの長さ(len)を事前に確認しているか
  • インデックスが0〜len()-1の範囲内に収まっているか
  • 辞書のキーの一覧(user.keys())に、そのキーが含まれているか

必要に応じて、次のような安全なアクセス方法を使うこともあります。

Python
# KeyErrorを避けるには get を使う
age = user.get("age", None)  # なければ None を返す

第6位: ImportErrorとModuleNotFoundError

ImportErrorとModuleNotFoundErrorは、モジュールやパッケージの読み込みに失敗したときのエラーです。

ModuleNotFoundErrorの典型例

Python
import numppy  # numpy のスペルミス
実行結果
ModuleNotFoundError: No module named 'numppy'

No module named 'xxx' というメッセージは、「xxxという名前のモジュールは見つからない」と伝えています。

ImportErrorの例

Python
from math import sqr  # math モジュールに sqr という名前はない
実行結果
ImportError: cannot import name 'sqr' from 'math'

これは、「mathからsqrという名前はインポートできない」という意味です。

対処のポイント

ImportError/ModuleNotFoundErrorが出たときは、次を確認します。

  • モジュール名のスペルが正しいか
  • そのモジュールが本当にインストールされているか
    (外部ライブラリの場合はpip install パッケージ名が必要)
  • 相対パスのパッケージ構成が正しいか

例えば、外部ライブラリrequestsをインポートしたい場合は、事前に次のようにインストールします。

Shell
pip install requests

第7位: ValueError

ValueErrorは、「型は合っているが、その中身(値)が不正」というエラーです。

よくあるValueErrorの例

Python
# 文字列を整数に変換しようとしている
text = "abc"
number = int(text)  # 文字列だが数字ではないのでエラー
実行結果
ValueError: invalid literal for int() with base 10: 'abc'

メッセージは「10進数としてint()に渡すには不正な文字列だ」と伝えています。

対処の考え方

ValueErrorが出たら、

  • 関数やメソッドがどんな条件の値を期待しているかをドキュメントで確認する
  • 処理前に値のチェックを挟む

といった対策が有効です。

第8位: IndentationError

IndentationErrorは、インデント(行頭の空白)に問題がある場合に発生するエラーです。

Python
def hello():
print("Hello")  # インデントが必要だが無い
実行結果
IndentationError: expected an indented block

このメッセージは「インデントされたブロックが必要だった」と伝えています。

対処のポイント

  • 関数定義、if文、for文などの直後の行は必ずインデントする
  • インデントはスペース4つに統一し、タブとスペースを混在させない
  • エディタの設定で「タブをスペースに変換する」をオンにしておく

第9位: ZeroDivisionError

ZeroDivisionErrorは、その名の通り「0で割ろうとした」ときのエラーです。

Python
x = 10
y = 0
print(x / y)  # 0で割る
実行結果
ZeroDivisionError: division by zero

対策としては、割る前に0でないかをチェックすることが基本です。

Python
if y == 0:
    print("0では割れません")
else:
    print(x / y)

第10位: FileNotFoundErrorなどI/Oエラー

FileNotFoundErrorは、「指定したファイルやディレクトリが見つからない」ときに出るエラーです。

Python
with open("data.txt") as f:
    content = f.read()

存在しないファイルを指定すると、次のようになります。

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

No such file or directory は「そのようなファイルやディレクトリはない」という意味です。

対処のコツ

  • ファイルの場所(パス)が正しいかを確認する
  • 実行しているカレントディレクトリを意識する
  • os.path.exists()pathlib.Path で存在確認を行う

エラー原因の見つけ方とデバッグの基本

エラー箇所を特定するためのtracebackのたどり方

トレースバックを正しくたどることは、エラー原因の特定に直結する重要スキルです。

具体例でのたどり方

次のコードを見てみます。

Python
def calc_discount(price, rate):
    return price * rate / 100

def show_result():
    price = "1000"  # 本当は数値にしたかった
    rate = 10
    result = calc_discount(price, rate)
    print(result)

show_result()

実行すると、次のトレースバックが出ます。

Traceback (most recent call last):
  File "example.py", line 10, in <module>
    show_result()
  File "example.py", line 7, in show_result
    result = calc_discount(price, rate)
  File "example.py", line 3, in calc_discount
    return price * rate / 100
TypeError: can't multiply sequence by non-int of type 'str'

たどり方は次の通りです。

  1. 一番下のTypeErrorと説明文を読む
  2. そのすぐ上のline 3の行で、どの演算に問題があるかを見る
  3. さらに上のline 7で、どんな引数を渡しているかを確認する

この例では、文字列"1000"を数値のように扱おうとしたことが原因だとわかります。

エラー行だけでなく前後のコードも確認する理由

トレースバックには「line X」と行番号が出ますが、実際の原因はその1行だけとは限りません。

例えば、次のようなケースです。

Python
total = 0
for i in range(10)
    total += i  # ← トレースバックでこの行が指摘されることがある

本当の問題はfor行の:抜けなのに、エディタによっては次の行が強調されたりします。

そのため、エラー行だけでなく、その前後もセットで確認する習慣が重要です。

printデバッグとloggingの使い分け

エラーの原因がすぐには分からないとき、値の中身を確認するための手段として「printデバッグ」と「logging」があります。

printデバッグの例

Python
def calc(a, b):
    print("DEBUG: a =", a, "b =", b)  # 途中経過を表示
    return a / b

calc(10, 0)
実行結果
DEBUG: a = 10 b = 0
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero

printは、素早く状況を確認するにはとても便利です。

ただし、コードが増えると「デバッグ用print」が散らばって管理しづらくなります。

loggingの利用

より本格的には、loggingモジュールを使います。

Python
import logging

# ログの基本設定
logging.basicConfig(level=logging.DEBUG)

def calc(a, b):
    logging.debug("a=%s, b=%s", a, b)  # デバッグ情報をログとして出力
    return a / b

calc(10, 0)
実行結果
DEBUG:root:a=10, b=0
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero

loggingを使うと、表示のオンオフやログレベルの切り替えが簡単になるため、少し大きめのプログラムではこちらを使う方が適しています。

最小コードに切り出して再現させるテクニック

原因がなかなか特定できないときは、エラーを再現できる最小限のコード(最小再現コード)を作るのが有効です。

最小再現コードを作る手順

  1. エラーが出るスクリプトをコピーする
  2. 関係なさそうな処理や外部依存を一つずつ削ってみる
  3. それでもまだ同じエラーが出る部分だけを残す

これを繰り返すと、「何をしたときにエラーが出るのか」がクリアに見えてきます

また、最小再現コードは質問サイトや他人に相談するときにも非常に役立ちます。

エラーを検索する時のキーワードの選び方

エラーで困ったとき、インターネット検索は強力な武器になります。

このときのキーワード選びとして、次を意識します。

  • エラーの種類(例外名)を含める(TypeErrorなど)
  • エラーの英文メッセージをできるだけそのままコピペする
  • 追加で「python」「初心者」などを加える

例:

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

自分で意訳した日本語を検索するより、エラー文そのものを使う方が、ピンポイントな情報にたどり着きやすいです。

Python初心者がエラーで挫折しないための習慣

コードを書く前にエラーが出にくい書き方を意識する

エラーを減らすには、書き方の段階でミスを起こしにくいスタイルを意識することが有効です。

例えば、次の点を心がけます。

  • 変数名や関数名を意味のある名前にする(後で読みやすくなる)
  • 1行に詰め込みすぎず、ステップを分けて書く
  • 条件分岐やループのブロックを空行やコメントで区切る

こうした工夫により、「どこがおかしいのか」を自分で目視しやすくなり、エラーの発見と修正がスムーズになります。

Linterや型チェックツールでエラーを事前に防ぐ

Pythonでは、Linter(静的解析ツール)や型チェックツールを使うことで、実行前にミスを検出できます。

代表的なツールには、次のようなものがあります。

種類ツール例役割
Linterflake8, ruff文法ミスやスタイルの問題を指摘
フォーマッタblackコードの書き方を自動で整形
型チェッカーmypy, pyright型ヒントを使って型の不整合を検出

エディタ(VS Codeなど)と連携させると、コードを書いている最中から赤線・波線で問題箇所を警告してくれるので、SyntaxErrorやTypeErrorの多くを事前に防ぐことができます。

エラーメッセージを無視せず必ず読む習慣をつける

Pythonに限らず、プログラミングで大切なのは、エラーメッセージから逃げない習慣です。

最初は英語で難しく見えますが、ここまで見てきたように、

  • エラーの種類(例外名)
  • 英文の中のキーワード
  • 行番号とファイル名

の3点を押さえるだけでも、かなりヒントを得られます。

「エラーが出たら、まずは一番下の2〜3行を声に出して読む」くらいのつもりで、少しずつ慣れていくとよいです。

エラーと向き合うための学習法とおすすめリファレンス

エラーは、自分の弱点や理解不足を教えてくれる「先生」のような存在です。

エラーと上手に付き合うために、次のような学習サイクルを意識するとよいです。

  1. エラーが出たら、まずメッセージを読む
  2. そのエラー名(例: SyntaxError, TypeErrorなど)をメモする
  3. インターネット検索や書籍で、そのエラーの意味と典型パターンを調べる
  4. 自分なりの「エラー辞典」ノートやメモアプリにまとめる

参考になる情報源としては、

  • Python公式ドキュメント「Built-in Exceptions」
  • 日本語のPython入門サイトや書籍の「エラー解説」章
  • Q&Aサイト(Stack Overflow、teratailなど)

などがあります。

同じエラーに2回、3回と出会うたびに「前にも見たことがある」と感じられるようになれば、もう初心者卒業は目前です。

まとめ

Pythonのエラーメッセージは、最初こそ難しく感じられますが、「エラーの種類」「メッセージ」「行番号」の3点を押さえて、一番下から順に読むことを意識すれば、原因にたどり着きやすくなります。

本記事では、初心者が特につまずきやすいSyntaxErrorやNameErrorなどの代表的なエラーをランキング形式で紹介し、tracebackの読み方やprint/loggingによるデバッグ、最小再現コードの作り方など、実践的な対処法も解説しました。

エラーは失敗ではなく、プログラムからのフィードバックです。

エラーメッセージを味方につけ、少しずつ「読める」「直せる」経験を積み重ねていけば、Pythonでの開発はぐっと楽しく、頼もしいものになっていきます。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!