REFERENCE

Pythonよくあるエラー一覧と解決方法

初心者がよく遭遇する22種類のエラーを、原因・エラーメッセージ・解決方法とともに丁寧に解説します。表示された英語メッセージをそのままコピペして探せる逆引き表から始めれば、自分のエラーの解説に最短でたどり着けます。

🚨 エラー22種類🔎 逆引き表46行🎯 初心者〜中級者🔄 最終更新 2026-10-22

本ページはアフィリエイト広告(PR)を含みます(詳しくはページ末尾)。

🔎
エラーメッセージから探す

表示された英文の一部が合えば、そのリンクから解説へ移動できます。

ここに無いときは Ctrl + F(Mac は ⌘ + F。スマホは、iPhone の Safari は共有ボタン →「ページを検索」、Android の Chrome はメニュー(︙)→「ページ内検索」)で英語メッセージの一部を貼り付けて探すか、全46行の逆引き表・種類別の目次から探してください。
並び順は、2026年8月下旬〜9月中旬の当サイトの検索データで多かったメッセージの順です(一般の検索回数の順位ではありません)。

💡
まずここだけ読めば動き出せます

エラーが起きたら、まず最終行のエラーメッセージを確認しましょう。File "〜.py", line XX でエラーが起きた行番号がわかります。エラーの種類(TypeError: など)と説明文を組み合わせると原因を特定できます。表示された英語をそのまま探したい方は逆引き表へ、読み方から知りたい方はトレースバックの読み方へどうぞ。書き方そのものが合っているか確かめたいときは、Python構文チートシート83項目で正しい書き方を確認してください。

公式の解説もあわせてどうぞ:Python公式チュートリアル「エラーと例外」

Pythonのtraceback(エラーメッセージ)の読み方の図解。一番下のエラー名と内容を最初に読み、次にFile名とline番号で発生場所を確認し、その行のコードを見るという順序を示す
▲ tracebackは下から上へ。最終行のエラー名を逆引き表で探すのが近道

エラーメッセージ逆引き表(英語メッセージから探す)

Python のエラーは末尾に英語のメッセージが表示されます。その英文をそのまま下の表から探すと、原因と詳しい解説に最短でたどり着けます。表示されたメッセージ(NameError: の後ろなど)と見比べてください。'x' のようにクォートで囲まれた部分はあなたの変数名やファイル名が入る箇所なので、そこは読み替えて照合します。

表示される英語メッセージ(一部)エラーの種類かんたんな意味解説
invalid syntaxSyntaxErrorコロン・括弧・クォートの書き忘れなど文法ミス(構文エラー)§1へ
expected ':'SyntaxErrorif・for・def の行末のコロンが無い§1へ
'(' was never closed / '[' was never closedSyntaxError括弧が開いたまま閉じられていない§1へ
incomplete inputSyntaxErrorJupyter・Colab などのセル実行で、入力が途中で終わっている(同じコードをファイルとして実行すると '(' was never closed などに変わる)§1-3へ
unexpected EOF while parsing / unterminated string literalSyntaxError括弧やクォートが閉じられないまま行末・ファイル末尾に達した§1へ
invalid non-printable character U+3000SyntaxError全角スペースが紛れ込んでいる(日本語環境で頻出)§1へ
Missing parentheses in call to 'print'SyntaxErrorPython 2 の書き方 print "x" のまま書いている§1へ
expected an indented blockIndentationError字下げが必要な行がインデントされていない§2へ
unexpected indentIndentationError不要な字下げが入っている§2へ
inconsistent use of tabs and spacesTabErrorタブとスペースが混在している§2へ
name 'x' is not definedNameError未定義の変数/スペルミス§3へ
can only concatenate str (not "int") to strTypeError文字列と数値を + で結合した§4へ
'float' object cannot be interpreted as an integerTypeError整数が必要な所に小数を渡した(range() 等)§4へ
'NoneType' object cannot be interpreted as an integerTypeError整数が必要な所に None を渡した(値を返さない関数の戻り値など)§4へ
'str' object cannot be interpreted as an integerTypeError整数が必要な所に文字列を渡した(input() の結果をそのまま使った等)§4へ
unsupported operand type(s) for ...TypeError型が合わない同士で計算した§4へ
'X' object is not callableTypeError関数でないもの(変数・数値など)を () で呼び出した/関数名を変数で上書きした§4へ
'X' object is not subscriptableTypeError[ ] で添字アクセスできない型(数値・関数など)に添字を付けた§4へ
'NoneType' object is not iterableTypeErrorNone(戻り値がない関数の結果など)を for やアンパックで回そうとした§4へ
unhashable type: 'list'TypeErrorリストなど変更可能な値を辞書のキーや set の要素にした§4へ
takes N positional arguments but M were givenTypeError関数に渡した引数の個数が合わない(self の付け忘れも該当)§4へ
sort() takes no positional argumentsTypeErrorlist.sort() に引数を位置指定で渡した(key= や reverse= のキーワード指定が必要)§4へ
invalid literal for int() with base 10ValueError数値にできない文字列を int() に渡した§5へ
math domain errorValueErrormath.sqrt(-1) のように、数学的に定義できない値を math の関数に渡した§5へ
list index out of rangeIndexErrorリストの範囲外を参照した§6へ
string index out of rangeIndexError文字列の範囲外を参照した§6へ
list assignment index out of rangeIndexErrorまだ存在しない位置に lst[5] = x のように代入した§6へ
KeyError: 'x'KeyError辞書に存在しないキーを参照した§7へ
'X' object has no attribute 'Y'AttributeErrorメソッド名のスペルミス/型違い§8へ
'NoneType' object has no attribute ...AttributeErrorNone に対してメソッドを呼んだ§8へ
No module named 'x'ModuleNotFoundError未インストール/スペルミス/仮想環境§9へ
cannot import name 'X' from 'Y'ImportErrorモジュールはあるが、その中に指定した名前がない/循環インポート§21へ
cannot import name 'X' from partially initialized module(circular import)ImportError2つのファイルが互いに import し合う循環インポート§21へ
No such file or directoryFileNotFoundErrorファイルパスが間違っている§10へ
division by zeroZeroDivisionErrorゼロで割った§11へ
maximum recursion depth exceededRecursionError再帰の終了条件がなく無限に呼び出した§12へ
'utf-8' codec can't decode byte ...UnicodeDecodeError文字コードの指定が実ファイルと不一致§13へ
'cp932' codec can't decode byte ...UnicodeDecodeErrorUTF-8で保存されたファイルをcp932(Shift-JIS)として読んで失敗(Python 3.14 までの日本語Windowsでは encoding を省略すると既定がcp932。3.15(2026年10月9日リリース)からは UTF-8 が既定)§13へ
Permission deniedPermissionError権限不足/別アプリがファイルを使用中§14へ
cannot access local variable 'x' where it is not associated with a value(3.10以前は local variable 'x' referenced before assignment)UnboundLocalError関数内で global 宣言を忘れた§15へ
math range errorOverflowError浮動小数点が表現できる上限を超えた§17へ
main thread is not in main loopRuntimeErrorウィンドウを閉じた後など、mainloop が回っていないときに別スレッドから tkinter を操作した§19へ
StopIterationStopIterationnext() でイテレータの終端を越えて進めた§16へ
MemoryErrorMemoryError巨大データを一度に読み込みメモリを使い果たした§18へ
AssertionErrorAssertionErrorassert 文の条件が False になった§20へ
KeyboardInterruptKeyboardInterrupt実行中に Ctrl + C を押した/無限ループを手動で止めた§22へ
🔎
表に無いメッセージのときは

このページ内を、英語メッセージの一部で検索すると該当箇所がすぐ見つかります。パソコンは Ctrl + F(Mac は ⌘ + F)、スマホは iPhone の Safari なら共有ボタン →「ページを検索」、Android の Chrome ならメニュー(︙)→「ページ内検索」で検索欄を出せます。種類別の目次から探すこともできます。

なお、エラーメッセージの文面は Python のバージョンで変わることがあります。たとえば括弧の閉じ忘れは、3.9 以前が unexpected EOF while parsing、3.10 以降は '(' was never closed のように、より具体的な表現に改善されています。Python 3.10 以降では NameError: name 'prnt' is not defined. Did you mean: 'print'? のように正しい候補まで提示されるので、まずその候補を試すのが最短です。ただしこの候補表示は、Jupyter・Colab(IPython)のように独自のエラー表示を使う環境では出ないことがあります(本ページの検証環境は Python 3.12.10 / Windows)。

エラーメッセージ(トレースバック)の読み方

Python のエラー表示は Traceback(トレースバック) と呼ばれます。何行も英語が並ぶので身構えてしまいますが、読む順番を決めてしまえば数秒で原因の場所にたどり着けます。ポイントはひとつ、上からではなく下から読むことです。

複数ファイルにまたがるPythonのトレースバックを読む順序の図解。①最終行でエラーの種類と内容を読み、②下から2つ目のFile行で実際に落ちた場所とキャレット記号が指す式を確認し、③File行の並びを上から下へ見て呼び出し経路をたどる、という3ステップを示す
▲ 複数ファイルにまたがる場合の読む順序。①最終行 → ②発生行 → ③呼び出し経路

実際に落としたコードで確かめる

説明だけでは分かりにくいので、実際にエラーを起こしてみます。次の2つのファイルを同じフォルダに置いてください。

utils.py
def calc_average(values):
    return sum(values) / len(values)
main.py
from utils import calc_average

scores = []                       # 空のリストを渡してしまった
print(calc_average(scores))

main.py を実行すると、次のトレースバックが表示されます。

Traceback (most recent call last):
  File "C:\python\main.py", line 4, in <module>
    print(calc_average(scores))
          ^^^^^^^^^^^^^^^^^^^^
  File "C:\python\utils.py", line 2, in calc_average
    return sum(values) / len(values)
           ~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
🔬
この出力について

Python 3.12.10(Windows)で実際に実行した出力です。ファイルパスの部分だけ C:\python\ と短く書き換えています(実際にはお使いのフォルダのフルパスが表示されます)。行番号・記号・メッセージは実行結果そのままです。

読む順番は ①最終行 → ②発生行 → ③呼び出し経路

  • 1
    一番下の行を読む(エラーの種類と内容)

    この例では ZeroDivisionError: division by zero。コロンの左がエラーの種類、右が内容です。この英文を逆引き表で探せば、原因と直し方の解説にすぐ飛べます。

  • 2
    下から2つ目の File 行を見る(実際に落ちた場所)

    File "C:\python\utils.py", line 2, in calc_average なので、utils.py の2行目、calc_average 関数の中で落ちています。すぐ下にその行のコードが再掲されるので、エディタで開かなくても内容が確認できます。

  • 3
    File 行の並びを上から下へ見る(呼び出し経路)

    File 行は呼び出した順に並びます。この例は「main.py の4行目が calc_average() を呼び、その中で落ちた」という経路です。本当の原因は上のほうにあることが多いのがポイントで、ここでは utils.py ではなく、空のリストを渡した main.py の3行目を直すべきだと分かります。

「^^^^」「~~~~^~~~~」の記号が指しているもの

コード行の下に付く記号は、その行のどの部分でエラーが起きたかを文字単位で示すマーカーです。1行に複数の処理が並んでいても、犯人をピンポイントで特定できます。

記号意味
^^^^エラーが起きた式そのものの範囲。例では calc_average(scores) の呼び出し全体
~~~~^~~~~~ が演算の左右のオペランド、^ がその演算子。例では sum(values) / len(values) の / が原因だと示している
💡
記号が出ないときはバージョンが古い可能性があります

この位置マーカーは Python 3.11 で追加された機能です(PEP 657)。3.10 以前では表示されないので、記号が出ない環境ではエラー行のコードを自分で読む必要があります。バージョンは python --version で確認できます。導入や更新の手順はPythonのインストールにまとめています。

自分が書いていないファイルが出てきたときは

pandas や requests などのライブラリを使っていると、トレースバックに site-packages 配下の見覚えのないファイルが並ぶことがあります。そんなときは下から順に見ていき、自分のファイル名が最初に出てくる File 行を探してください。そこが「自分のコードがライブラリを呼んだ場所」で、多くの場合は渡した値が原因です。ライブラリの中身を読む必要はほとんどありません。

英語のメッセージは翻訳せず、そのまま検索する

エラーメッセージを日本語に訳してから検索すると、情報量が一気に減ります。英語のまま検索するのが基本です。検索するときは次の2点を意識すると精度が上がります。

  • 自分固有の部分を消す:No module named 'pandas_myapp' のようにクォート内は自分の環境の名前なので、検索では No module named のように共通部分だけを使うか、一般的なライブラリ名に置き換えます
  • 先頭に python を付ける:python list index out of range のようにすると、他言語の同名エラーが混ざりません

公式の説明を直接読みたいときは、Python公式ドキュメント「組み込み例外」にすべての例外の定義がまとまっています。

Pythonエラーの5分類マップ。文法・インデント系(SyntaxError・IndentationError)、名前・型・値系(NameError・TypeError・ValueError・AttributeError)、リスト・辞書系(IndexError・KeyError)、インポート・ファイル系(ModuleNotFound・FileNotFound・UnicodeDecode・Permission)、実行時・その他(ZeroDivision・Recursion・Runtime・Assertion)の5グループに分かれる図
▲ エラーは大きく5種類。どの仲間かが分かると原因を絞りやすい
📋 目次(種類別・🔴=初心者頻出 / 🟡=ときどき)

1. SyntaxError(構文エラー)

⚡

症状:SyntaxError: expected ':' などが出て、1行も実行されない
よくある原因:コロンの書き忘れ/括弧・クォートの閉じ忘れ/全角スペース・全角記号の混入
まず試す1手:メッセージ別の早見表で英文を照合し、^ が指す位置を直す

日本語で構文エラーと呼ばれるエラーです。Pythonの文法規則に違反したコードを書いたときに発生します。プログラムの実行前にチェックされるため、1行でも構文エラーがあると、そのファイルは1行も実行されません。「print の結果すら表示されない」と感じたら、まずこのエラーを疑ってください。

SyntaxError のよくある原因(コロン・括弧・全角文字)

  • コロン(:)の書き忘れ(if・for・defの行末)
  • 括弧・クォートの閉じ忘れ
  • 全角スペースや全角文字の混入
❌
エラーになるコード
if x > 0   # コロンがない
    print("正の数")

for i in range(5)  # コロンがない
    print(i)

print("Hello"  # 括弧が閉じていない
✅
解決方法
if x > 0:       # コロンを追加
    print("正の数")

for i in range(5):  # コロンを追加
    print(i)

print("Hello")  # 括弧を閉じる
⚠️
全角文字に注意

日本語環境では全角スペース( )が混入することがあります。エラー行に見た目上の問題がない場合は、全角文字が混入していないか確認しましょう。VSCodeなら全角スペースが可視化されます。実際に print(x) の行頭へ全角スペースを1つ入れて実行すると、SyntaxError: invalid non-printable character U+3000 と表示されます(U+3000 が全角スペースの文字コードです)。全角の丸括弧を使った場合は SyntaxError: invalid character '(' (U+FF08) になります。

構文エラーのメッセージ別・直し方早見表

SyntaxError はメッセージを見れば原因がほぼ絞れます。以下はすべて Python 3.12.10 で実際に実行して確認した表示です。表示された英文と見比べてください。

表示されるメッセージ原因直し方
expected ':'if・for・def・class の行末にコロンが無い行末に : を付ける
'(' was never closed開いた括弧が閉じられていない指し示された括弧に対応する ) を補う。[ や { でも同じ形式で表示される
unterminated string literal (detected at line N)クォートが閉じられていない行末に閉じクォートを補う。三重クォートの場合は unterminated triple-quoted string literal と表示される
invalid syntax. Maybe you meant '==' or ':=' instead of '='?if x = 1: のように、比較すべき場所で代入している比較は == に直す
invalid syntax. Perhaps you forgot a comma?リストや引数の区切りのカンマが抜けている指摘された位置に , を補う
Missing parentheses in call to 'print'. Did you mean print(...)?Python 2 の書き方 print "x" のまま書いているprint("x") と括弧を付ける
invalid non-printable character U+3000全角スペースが紛れ込んでいる該当位置の全角スペースを半角に置き換える
invalid character '(' (U+FF08)全角の括弧・クォートなどを使っている半角記号に直す。日本語入力のオン・オフの切り替え忘れが原因
invalid decimal literal12abc のように数字で始まる不正な名前・数値を書いた変数名は数字で始められない。abc12 のように直す
cannot assign to literal here. Maybe you meant '==' instead of '='?5 = x のように左辺と右辺が逆になっている代入は x = 5 の向きに直す
'return' outside functionreturn を関数の外に書いた(インデント漏れも該当)def の中に入れる。インデントを確認する

「SyntaxError: incomplete input」と表示されたら(Jupyter・Colab で出る)

SyntaxError: incomplete input は、Pythonが「コードがまだ途中で終わっている」と判断したときに出る構文エラーです。特徴的なのは出る場所が限られていることで、手元の Python 3.12.10 と IPython 9.16.1 で試したところ、次の結果になりました。

実行のしかたprint("hello" を実行した結果
Jupyter Notebook・Google Colab・IPython のセルSyntaxError: incomplete input
python main.py でファイルとして実行SyntaxError: '(' was never closed
ターミナルの対話モード(>>>)入力途中とみなされ ... の継続プロンプトになる

つまり incomplete input を見ているなら、ほぼ確実に Jupyter・Colab 系のセル実行環境です(これらは内部で IPython を使っています)。原因はほぼ閉じ忘れで、次の4パターンがいずれも incomplete input になることを確認しました。

print("hello"        # 丸括弧を閉じていない
x = [1, 2,           # 角括弧を閉じていない
x = """abc           # 三重クォートを閉じていない
if True:             # コロンの後に中身を書いていない
✅
直し方の手順
  1. そのセル・その入力の最後の行から上へ、( [ { と " ' の数が合っているか確認する
  2. if や for、def でコロンまで書いて中身が空なら、中身を書くか仮に pass を置く
  3. セル全体をコピーして .py ファイルに貼り、python ファイル名.py で実行し直す

3 の方法が有効なのは、ファイルとして実行するとより具体的なメッセージに変わるからです。同じ print("hello" でも、ファイル実行なら SyntaxError: '(' was never closed と表示され、どの括弧が原因かまで教えてくれます。原因が分からないときの回り道として覚えておくと便利です。

⚠️
Jupyter でよくあるもう一つの原因

ノートブックのセルは1つずつ実行されるため、複数行にまたがる処理を途中でセル分割してしまうと incomplete input になります。関数定義やループは、def から中身まで同じセルに収めてください。

コロンやクォート、括弧のルールがあいまいだとSyntaxErrorは繰り返し起こります。Pythonの基本構文で if・for・def の書き方を一度整理しておくと、根本から減らせます。書き方をその場で確認したいときは基本構文チートシート83項目が早いです。

if・for・def の書き方を手で覚えたいなら、苦手スキル別ドリルの「条件分岐が複雑になると混乱」のお題(じゃんけん → ログインフォーム)を1本作ってみてください。

2. IndentationError(インデントエラー)

⚡

症状:IndentationError: expected an indented block
よくある原因:タブとスペースの混在/字下げの深さの不一致/if・def の直後の字下げ忘れ
まず試す1手:エラー行と1つ上の行をスペース4つで揃え直す

日本語でインデントエラー(字下げのエラー)と呼ばれます。Pythonはインデント(字下げ)でコードブロックの範囲を表現するため、他の言語なら見た目の問題で済むズレが、そのままエラーになります。SyntaxError(構文エラー)の一種で、これも実行前に検出されます。

インデントエラー(IndentationError)のよくある原因(タブとスペースの混在)

  • スペースとタブを混在させている
  • インデントの深さが揃っていない
  • インデントが必要な箇所でされていない
❌
エラーになるコード
def greet(name):
    print("Hello")
  print(name)      # インデントの深さが違う

if True:
print("OK")        # インデントがない(expected an indented block)
✅
解決方法
def greet(name):
    print("Hello")
    print(name)    # 同じ深さに揃える(スペース4つ)

if True:
    print("OK")    # ifブロック内は1段階深くインデント
💡
スペース4つが標準

Pythonの慣習ではスペース4つでインデントします。VSCodeでは「インデントをスペースに変換」設定でタブをスペースに統一できます。エディタの設定で「タブをスペースで表示」をオンにすると混在を防げます。

インデントエラー(IndentationError)のメッセージ別・原因早見表

IndentationError はメッセージで原因がほぼ特定できます。表示された英文と見比べてください。

エラーメッセージ意味直し方
expected an indented blockインデントすべき行(if・for・def の直後など)が字下げされていないブロックの中身を1段階(スペース4つ)下げる。中身を後で書くなら仮に pass を置く
unexpected indentインデント不要な行が字下げされている行頭の余分なスペースを削除する。コピペ直後によく起きる
unindent does not match any outer indentation levelインデントの深さがどの階層とも一致しない(タブとスペースの混在が典型)該当行を一度行頭まで消して、スペースだけで揃え直す
inconsistent use of tabs and spaces(TabError)同じブロック内でタブとスペースが混在下記のVSCode手順でファイル全体をスペースに統一する

VSCodeで混在を一括解消する手順

  1. 右下ステータスバーの「スペース: 4」(または「タブのサイズ」)表示をクリック
  2. 「インデントをスペースに変換」を選択 → ファイル全体のタブがスペースに置き換わる
  3. 再発防止に、設定(Ctrl+,)で「Editor: Insert Spaces」をオン、「Editor: Render Whitespace」を all にすると空白が可視化されて混在に気づけます

それでも解決しない場合は、エラー行だけでなくその1つ上の行のインデントも確認してください。原因がエラー表示行の手前にあることがよくあります。空白の可視化やタブ→スペース変換の設定はVSCodeのセットアップのページにまとめています。

3. NameError(名前エラー)

⚡

症状:NameError: name 'message' is not defined
よくある原因:スペルミス/代入前に参照した/スコープ外の変数を参照した
まず試す1手:3.10 以降は Did you mean: の候補を試し、無ければ定義と1文字ずつ見比べる

定義されていない変数・関数・クラスを使おうとしたときに発生します。

NameError のよくある原因(スペルミス・定義前の参照)

  • 変数名のスペルミス(count を coutn と書くなど)
  • 変数を代入する前に参照している
  • スコープ外の変数を参照している
❌
エラーになるコード
print(message)         # まだ定義していない

# NameError: name 'message' is not defined

total = coutn + 1      # スペルミス
# NameError: name 'coutn' is not defined
✅
解決方法
message = "Hello"      # 使う前に定義する
print(message)

count = 0
total = count + 1      # 正しいスペルで

4. TypeError(型エラー)

⚡

症状:TypeError: can only concatenate str (not "int") to str
よくある原因:文字列と数値の + 結合/引数の個数違い/range() に整数以外
まず試す1手:print(x, type(x)) で型を確かめる

異なる型同士の演算や、関数への引数の型が合わないときに発生します。

TypeError のよくある原因(文字列と数値の連結・引数の数)

  • 文字列と数値を + で結合しようとした
  • 整数が必要な場所(range() など)に文字列・小数・None を渡した
  • 関数の引数の数が合わない
❌
エラーになるコード
age = 25
print("年齢は" + age + "歳です")
# TypeError: can only concatenate str (not "int") to str

def add(a, b):
    return a + b

add(1, 2, 3)
# TypeError: add() takes 2 positional arguments but 3 were given
✅
解決方法
age = 25
# 方法1: str()で変換
print("年齢は" + str(age) + "歳です")

# 方法2: f-string(推奨)
print(f"年齢は{age}歳です")

def add(a, b):
    return a + b

add(1, 2)  # 引数の数を合わせる
💡
その他のよくある TypeError(早見表)
エラーメッセージよくある原因直し方
'X' object is not callable関数でないもの(変数・数値・リスト)を () で呼び出した。関数名と同じ名前の変数で上書きしているケースが多い同名の変数で関数を潰していないか確認(例: list = [1,2] の後に list(...) は不可)
'X' object is not subscriptable角括弧 [] で添字アクセスできない型(関数・数値・None)に x[0] した対象が本当にリスト/辞書/文字列か確認。関数なら () の付け忘れを疑う
'NoneType' object is not iterableNone を for やアンパックで回した。値を return しない関数の戻り値を使っていることが多い関数がちゃんと値を返しているか、変数が None でないか確認
unhashable type: 'list'リストや辞書を、辞書のキーや set の要素に使った(変更可能な型はハッシュ化できない)キーには (1, 2) のようなタプル(変更不可の型)を使う
'NoneType' object cannot be interpreted as an integer整数が必要な場所に None を渡した。range(n) の n が、値を return し忘れた関数の戻り値になっているケースが典型渡す直前に print(n, type(n)) で確認し、関数が値を返しているかを見る
'str' object cannot be interpreted as an integer整数が必要な場所に文字列を渡した。input() の戻り値をそのまま range() に入れた場合が典型(input() は常に文字列を返す)range(int(input())) のように int() で変換する
'float' object cannot be interpreted as an integer整数が必要な場所に小数を渡した(range(2.5) など)int(2.5) で整数に変換する。割り算の結果を使うなら / ではなく // を使う
sort() takes no positional argumentslist.sort() に引数を位置指定で渡した([3,1,2].sort(True) など)。sort() はキーワード引数しか受け取らないsort(reverse=True)・sort(key=len) のように 名前=値 の形で渡す

5. ValueError(値エラー)

⚡

症状:ValueError: invalid literal for int() with base 10: 'abc'
よくある原因:数字以外の文字列を int() に渡した/要素数の不一致/strptime() の書式違い
まず試す1手:末尾の '…' の値を確かめる

型は正しいが、値が無効なときに発生します。文字列を整数に変換しようとして失敗するケースが最多です。

ValueError のよくある原因(int() への変換失敗・アンパック)

  • 数字以外の文字列を int() や float() に渡した
  • リストに存在しない値を remove() した
  • unpack 時の要素数が合わない
  • 日付の文字列が strptime() に渡した書式と合わない(日付フォーマット早見表のエラー集)
❌
エラーになるコード
num = int("abc")
# ValueError: invalid literal for int() with base 10: 'abc'

num = int("3.14")
# ValueError: invalid literal for int() with base 10: '3.14'

a, b = [1, 2, 3]
# ValueError: too many values to unpack (expected 2)
✅
解決方法
# 変換前にチェックするか、try-except で対処
text = "abc"
try:
    num = int(text)
except ValueError:
    print(f"'{text}' は整数に変換できません")

# 小数点を含む文字列はfloat()で変換
num = float("3.14")   # 3.14
num_int = int(float("3.14"))  # 3

# アンパックの要素数を合わせる
a, b, c = [1, 2, 3]
# または
a, *rest = [1, 2, 3]  # a=1, rest=[2,3]

ValueError: math domain error も ValueError の仲間です。math.sqrt(-1) や math.log(0) のように、数学的に答えが定義できない値を math の関数に渡したときの表示で、Python 3.12.10 でどちらも同じメッセージになることを確認しています。Python 3.14 以降は expected a nonnegative input, got -1.0(sqrt)や expected a positive input(log)のように、関数ごとの具体的な文面に変わります(手元の Python 3.14.7 で確認)。負の数やゼロを渡していないか、渡す直前に print(x) で値を確かめてください。負数の平方根を扱いたい場合は cmath.sqrt(-1) を使うと複素数として計算できます。

入力欄やCSVから受け取った文字列を float() に渡す場合は、読めない文字列より「読めてしまう値」のほうが厄介です。全角数字・"0"・負の数・"nan"・"inf" はいずれも ValueError にならずに通り、変換に成功したあとで計算のほうが壊れます(一方で全角の小数点「.」は弾かれます)。Python 3.12.10 で15パターンを実際に通した一覧はBMI計算アプリの「float() が通すもの・弾くもの」で確認できます。

6. IndexError(インデックスエラー)

⚡

症状:IndexError: list index out of range
よくある原因:要素数と同じ番号を指定した(最大は len()-1)/空のリストを参照した/まだ無い位置に代入した
まず試す1手:print(len(items), i) で比べる

リストや文字列の存在しないインデックスにアクセスしたときに発生します。

IndexError のよくある原因(0始まりの添字・空リスト)

  • 要素数と同じインデックスを指定した(0始まりなので最大は len()-1)
  • 空リストの要素にアクセスした
  • ループ内でインデックス計算を間違えた
❌
エラーになるコード
items = ["apple", "banana", "cherry"]

print(items[3])    # インデックス3は存在しない(0〜2)
# IndexError: list index out of range

empty = []
print(empty[0])    # 空リスト
# IndexError: list index out of range
✅
解決方法
items = ["apple", "banana", "cherry"]

# インデックスの範囲を確認してからアクセス
i = 3
if i < len(items):
    print(items[i])
else:
    print("インデックスが範囲外です")

# 最後の要素は -1 で取得できる
print(items[-1])   # "cherry"

# 空リストチェック
if items:
    print(items[0])

「list assignment index out of range」と表示されたら

読み取りではなく代入で範囲外を指定すると、メッセージが list assignment index out of range(リストへの代入が範囲外)に変わります。「まだ存在しない場所に値を入れようとした」という意味で、リストは代入だけでは自動的に伸びません。

❌
エラーになるコード
scores = []
scores[0] = 80     # 空のリストの0番目はまだ存在しない
# IndexError: list assignment index out of range

nums = [1, 2, 3]
nums[5] = 10       # 5番目もまだ存在しない
# IndexError: list assignment index out of range
✅
解決方法
scores = []
scores.append(80)          # 末尾に追加するなら append()
print(scores)              # [80]

# 決まった長さで先に確保しておく方法
nums = [0] * 6             # 0〜5番目まで用意される
nums[5] = 10
print(nums)                # [0, 0, 0, 0, 0, 10]

# 内包表記でまとめて作る方法
squares = [i * i for i in range(6)]
print(squares)             # [0, 1, 4, 9, 16, 25]

ループの中で result[i] = ... と書きたくなったら、多くの場合は result.append(...) か内包表記で書き直せます。基本構文チートシートのリスト操作の項目もあわせてどうぞ。

GUIアプリでは、同じ IndexError が tuple index out of range という形で出ることがあります。典型は tkinter の Listbox で何も選ばれていないのに listbox.curselection()[0] を読むケースで、選択が無いときの戻り値は空のタプルなので0番目が存在しません。画面には何も出ずターミナルにだけエラーが表示されるため、ボタンが無反応に見えるのが厄介です。再現手順と回避の書き方はToDoリストアプリで選択が空のまま削除したときの症状別チェックで確認できます。

7. KeyError(キーエラー)

⚡

症状:KeyError: 'email'
よくある原因:キー名のスペルミス/大文字・小文字の違い/キーがあるか確かめずに直接参照した
まず試す1手:print(person.keys()) で実際のキー一覧を表示して見比べる

辞書に存在しないキーにアクセスしたときに発生します。

KeyError のよくある原因(キーのスペルミス・大文字小文字)

  • キー名のスペルミス
  • 存在するか確認せずに直接アクセス
  • 大文字・小文字を間違えた(辞書のキーは大文字小文字を区別する)
❌
エラーになるコード
person = {"name": "Alice", "age": 25}

print(person["email"])
# KeyError: 'email'

print(person["Name"])  # 大文字小文字が違う
# KeyError: 'Name'
✅
解決方法
person = {"name": "Alice", "age": 25}

# 方法1: get()を使う(キーがなければNoneまたはデフォルト値)
print(person.get("email"))          # None
print(person.get("email", "未設定")) # "未設定"

# 方法2: inでキーの存在を確認
if "email" in person:
    print(person["email"])
else:
    print("emailキーが存在しません")

# 方法3: try-except
try:
    print(person["email"])
except KeyError as e:
    print(f"キーが見つかりません: {e}")

8. AttributeError(属性エラー)

⚡

症状:AttributeError: 'NoneType' object has no attribute 'append'
よくある原因:メソッド名のスペルミス/型の取り違え/None にメソッドを呼んだ
まず試す1手:dir() で使えるメソッドを一覧する

オブジェクトに存在しない属性やメソッドを呼び出したときに発生します。

AttributeError のよくある原因(メソッド名のスペルミス・None)

  • メソッド名のスペルミス(append を appned など)
  • 型を間違えた(リストに文字列のメソッドを使うなど)
  • None に対してメソッドを呼んだ
❌
エラーになるコード
nums = [3, 1, 2]
nums.shorting()    # shorting ではなく sort
# AttributeError: 'list' object has no attribute 'shorting'

result = None
result.append(1)   # None は append メソッドを持たない
# AttributeError: 'NoneType' object has no attribute 'append'

text = "hello"
text.append("!")   # 文字列はappendを持たない
# AttributeError: 'str' object has no attribute 'append'
✅
解決方法
nums = [3, 1, 2]
nums.sort()        # 正しいメソッド名

# Noneチェックをしてからメソッドを呼ぶ
result = []        # 初期値をリストにする
result.append(1)

# 文字列への追加は + か join を使う
text = "hello"
text = text + "!"
# または
text = "".join(["hello", "!"])

# どんなメソッドがあるか確認する方法
print(dir([]))     # リストのメソッド一覧
print(dir(""))     # 文字列のメソッド一覧

9. ModuleNotFoundError(モジュール未発見エラー)

⚡

症状:ModuleNotFoundError: No module named 'requests'
よくある原因:未インストール/スペルミス/仮想環境が無効
まず試す1手:python -m pip install パッケージ名 を実行し、python -m pip list で確認

インポートしようとしたモジュールが見つからないときに発生します。ImportError の一種です。

ModuleNotFoundError のよくある原因(未インストール・仮想環境)

  • モジュールを pip install していない(または pip コマンドが、python とは別の Python に入れている)
  • モジュール名のスペルミス
  • 仮想環境が有効化されていない
❌
エラーになるコード
import requests   # インストールされていない場合
# ModuleNotFoundError: No module named 'requests'

import numppy     # スペルミス
# ModuleNotFoundError: No module named 'numppy'
✅
解決方法
# ターミナルで python -m pip install を実行する
# python -m pip install requests
# python -m pip install numpy pandas matplotlib

# インストール後に正しいスペルでインポート
import requests
import numpy as np

# インストール済みパッケージの確認
# python -m pip list

# インポートできるか事前チェック(スクリプト内で)
try:
    import requests
except ModuleNotFoundError:
    print("requestsがインストールされていません")
    print("python -m pip install requests を実行してください")

pip コマンドと python コマンドが別の Python を指していると、入れたのに見つからないことがあります。python -m pip と書けば、いま起動する python に付属の pip が使われます(理由と確認方法はpython -m pip 形式が安全な理由)。

💡
標準ライブラリはインストール不要

os・sys・math・json・datetime などはPythonに最初から含まれています。それ以外のライブラリ(requests・numpy・pandasなど)は pip install が必要です。ただし tkinter は例外で、公式ドキュメントでは「オプションのモジュール」とされています。python.org の公式インストーラーではTcl/Tkが既定で同梱されますが、Linux系など配布元によっては別パッケージのため、No module named 'tkinter' になることがあります(この場合 pip install tkinter では解決しません)。配布元ごとの対処はtkinterでウィンドウを表示する方法(tkinterが使えるか確認する手順と対処表)にまとめています。

import する名前と pip install する名前が違うライブラリもあります。BeautifulSoup は import bs4 なのに、入れるときは pip install beautifulsoup4 です(スクレイピングツールのよくある問題)。スクリプトでは動くのに EXE にしたときだけ No module named で落ちる場合は、PyInstaller のつまずきやすい5か所の⑤を確認してください。

どのライブラリをどのコマンドで入れるかは主要ライブラリ一覧(pipインストール早見表)にまとめています。pip 自体が見つからない・python コマンドが動かないときは、まずPythonのインストールで環境を確認してください。

10. FileNotFoundError(ファイル未発見エラー)

⚡

症状:FileNotFoundError: [Errno 2] No such file or directory
よくある原因:パスの誤り/カレントディレクトリの違い/大文字・小文字の違い
まず試す1手:os.getcwd() で実行中のフォルダを確認

指定したパスにファイルが存在しないときに発生します。

FileNotFoundError のよくある原因(パスの誤り・カレントディレクトリ)

  • ファイルパスの書き間違い
  • カレントディレクトリが想定と異なる
  • ファイル名の大文字小文字が違う(特にLinux/Mac)
❌
エラーになるコード
with open("data.txt", "r") as f:
    content = f.read()
# FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

with open("C:/Users/hoge/myfile.txt", "r") as f:
    content = f.read()
# パスが間違っていてもFileNotFoundError
✅
解決方法
import os
from pathlib import Path

# 現在のディレクトリを確認
print(os.getcwd())

# ファイルの存在確認
path = Path("data.txt")
if path.exists():
    with open(path, "r", encoding="utf-8") as f:
        content = f.read()
else:
    print(f"ファイルが見つかりません: {path.resolve()}")

# try-exceptで安全に開く
try:
    with open("data.txt", "r", encoding="utf-8") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"エラー: {e}")

# スクリプトと同じフォルダのファイルを確実に開く
script_dir = Path(__file__).parent
data_path = script_dir / "data.txt"

EXE にしたアプリで、パスに _MEI を含む FileNotFoundError が出る場合は、画像や CSV を EXE に同梱し忘れています。対処はPyInstaller のつまずきやすい5か所の①にまとめています。

11. ZeroDivisionError(ゼロ除算エラー)

⚡

症状:ZeroDivisionError: division by zero
よくある原因:割る数の変数が 0 になっている/入力欄の「0」が float() を通り、そのまま割り算に使われた
まず試す1手:割る直前に if b == 0: で止め、0 のときの扱いを決める

数値をゼロで割ろうとしたときに発生します。

❌
エラーになるコード
result = 10 / 0
# ZeroDivisionError: division by zero

result = 10 // 0
# ZeroDivisionError: integer division or modulo by zero

result = 10 % 0
# ZeroDivisionError: integer modulo by zero
✅
解決方法
# 方法1: 事前にゼロチェック
def safe_divide(a, b):
    if b == 0:
        return None   # またはデフォルト値
    return a / b

print(safe_divide(10, 2))   # 5.0
print(safe_divide(10, 0))   # None

# 方法2: try-except
a, b = 10, 0        # b が 0 のときを想定
try:
    result = a / b
except ZeroDivisionError:
    result = 0
    print("0では割れません")

print(result)       # 0

入力欄から受け取った値では、捕まえるより「割る前に止める」ほうが親切なメッセージを出せます。float("0") は成功してしまうので except ValueError では拾えず、割り算の瞬間に上の3つとは別の float division by zero になります。Python 3.14 以降はこの3つも含めて、すべて division by zero に統一されました(手元の Python 3.14.7 で確認)。< 0 ではなく <= 0 で弾く理由と、GUIでの止め方はBMI計算アプリのZeroDivisionError対処に実測つきでまとめています。

12. RecursionError(再帰エラー)

⚡

症状:RecursionError: maximum recursion depth exceeded
よくある原因:再帰の終了条件(ベースケース)が無い/終了条件に到達しない
まず試す1手:先頭に return する条件があり、毎回そこへ近づくか確認

再帰関数が深すぎて、Pythonの再帰上限(デフォルト1000回)に達したときに発生します。

RecursionError のよくある原因(終了条件の不備・無限再帰)

  • 再帰の終了条件(ベースケース)が間違っている
  • 終了条件に到達しない無限再帰
❌
エラーになるコード
def countdown(n):
    print(n)
    countdown(n - 1)   # 終了条件がない無限再帰

countdown(5)
# RecursionError: maximum recursion depth exceeded
✅
解決方法
# 終了条件(ベースケース)を必ず書く
def countdown(n):
    if n <= 0:        # ベースケース
        print("終了")
        return
    print(n)
    countdown(n - 1)

countdown(5)   # 5, 4, 3, 2, 1, 終了

# 再帰が深くなる処理はループに書き換えることも検討
def countdown_loop(n):
    while n > 0:
        print(n)
        n -= 1
    print("終了")

# 再帰の上限を変更する場合(慎重に)
import sys
sys.setrecursionlimit(5000)

13. UnicodeDecodeError(文字コードエラー)

⚡

症状:UnicodeDecodeError: 'utf-8' codec can't decode
よくある原因:cp932 のファイルを UTF-8 で読んだ/encoding を省略した
まず試す1手:encoding="cp932"(逆なら "utf-8")で開き直す

ファイルを読み込む際、指定した文字コードと実際のファイルの文字コードが一致しないときに発生します。Windows環境でよく起こります。

UnicodeDecodeError のよくある原因(cp932 と UTF-8 の食い違い)

  • Windowsで作成したCSV/テキストファイルは cp932(Shift-JIS)の場合がある
  • encoding を指定しないときの既定は、Python 3.14 までは OS の設定(日本語Windowsなら cp932)、3.15 からは UTF-8(Python 3.15 の UTF-8 デフォルト化で確認する5点)
❌
エラーになるコード
with open("japanese.txt", "r", encoding="utf-8") as f:
    content = f.read()
# UnicodeDecodeError: 'utf-8' codec can't decode byte ...
# (ファイルがShift-JISで保存されている場合)
✅
解決方法
# Shift-JIS(cp932)で開く
with open("japanese.txt", "r", encoding="cp932") as f:
    content = f.read()

# cp932 でも読めないときは chardet で判定する(python -m pip install chardet が必要)
# chardet の判定は推測なので、外れることがある
import chardet
with open("japanese.txt", "rb") as f:
    raw = f.read()
detected = chardet.detect(raw)
encoding = detected["encoding"]
print(f"検出された文字コード: {encoding}")

if not encoding or detected["confidence"] < 0.5:
    # 判定できない・自信がないときは、よくある文字コードを順に試す
    for enc in ("utf-8", "cp932"):
        try:
            content = raw.decode(enc)
            break
        except UnicodeDecodeError:
            continue
    else:
        raise ValueError("文字コードを判定できませんでした")
else:
    content = raw.decode(encoding)

errors='replace' / 'ignore' は、読めない文字を置き換え・捨てて読み進めるだけで、直ったわけではありません(最後の手段)。まず encoding="cp932" を試し、駄目なら文字コードを判定してください。手順はUnicodeDecodeError: 'utf-8' codec can't decode の直し方で詳しく扱っています。

# 最後の手段(上の方法で読めないときだけ)
# errors="replace" は読めない文字を置き換え、"ignore" は捨てるだけ。直ったわけではない
with open("japanese.txt", "r", encoding="utf-8", errors="replace") as f:
    content = f.read()

14. PermissionError(権限エラー)

⚡

症状:PermissionError: [Errno 13] Permission denied
よくある原因:Excel などがそのファイルを開いている/読み取り専用ファイル/保護されたフォルダ
まず試す1手:そのファイルを開いているアプリを閉じて再実行する

ファイルやディレクトリへのアクセス権限がないときに発生します。

PermissionError のよくある原因(別アプリが使用中・読み取り専用)

  • 他のアプリケーションが同じファイルを開いている(Excelで開いているCSVなど)
  • 読み取り専用ファイルへの書き込み
  • システムフォルダや保護されたパスへのアクセス
❌
エラーになるコード
with open("data.csv", "w") as f:   # Excelで開いている場合
    f.write("name,age\n")
# PermissionError: [Errno 13] Permission denied: 'data.csv'
✅
解決方法
import os

# 1. 他のアプリでファイルが開いていないか確認してから実行

# 2. try-exceptで対処
try:
    with open("data.csv", "w", encoding="utf-8") as f:
        f.write("name,age\n")
except PermissionError:
    print("ファイルが他のプログラムで使用中か、権限がありません")
    print("Excelなど開いているアプリを閉じてから再実行してください")

# 3. 書き込み先を変更する
output_path = os.path.join(os.path.expanduser("~"), "output.csv")
with open(output_path, "w", encoding="utf-8") as f:
    f.write("name,age\n")

15. UnboundLocalError(未束縛ローカル変数エラー)

⚡

症状:UnboundLocalError: cannot access local variable 'count' …
よくある原因:関数内でグローバル変数と同じ名前に代入し、その前で参照した
まず試す1手:引数と戻り値で受け渡す(急ぐなら global 宣言)

関数内でグローバル変数と同名のローカル変数を代入しようとしたが、代入前に参照してしまったときに発生します。

❌
エラーになるコード
count = 0

def increment():
    print(count)    # ここでエラー
    count += 1      # 代入があるので count はローカル変数とみなされる

increment()
# Python 3.11 以降:
# UnboundLocalError: cannot access local variable 'count'
#                    where it is not associated with a value
# Python 3.10 以前:
# UnboundLocalError: local variable 'count' referenced before assignment
✅
解決方法
count = 0

# 方法1: global宣言を使う
def increment():
    global count
    print(count)
    count += 1

increment()  # 0
increment()  # 1

# 方法2: 引数と戻り値を使う(より良い設計)
def increment(count):
    return count + 1

count = 0                 # 方法2はあらためて0から試す
count = increment(count)  # count = 1
count = increment(count)  # count = 2

# 方法3: クラスを使って状態を管理する
class Counter:
    def __init__(self):
        self.count = 0
    def increment(self):
        self.count += 1

このエラーは変数の「スコープ(有効範囲)」を理解すると避けやすくなります。関数の使い方で引数・戻り値・ローカル変数とグローバル変数の違いを整理しておくのがおすすめです。

16. StopIteration(イテレータ終端エラー)

⚡

症状:next() の行で StopIteration と表示されて止まる
よくある原因:要素が無くなったあとも next() でイテレータを進めた
まず試す1手:next(items, None) のように既定値を渡すか、for 文で回す

next() でイテレータを手動で進めようとしたが、要素がなくなったときに発生します。

❌
エラーになるコード
items = iter([1, 2])

print(next(items))   # 1
print(next(items))   # 2
print(next(items))   # StopIteration(要素がない)
✅
解決方法
items = iter([1, 2])

# 方法1: next()のデフォルト値を指定
print(next(items, None))   # 1
print(next(items, None))   # 2
print(next(items, None))   # None(エラーにならない)

# 方法2: try-except
items = iter([1, 2])
while True:
    try:
        item = next(items)
        print(item)
    except StopIteration:
        break

# 方法3: 普通のforループ(最も推奨)
for item in [1, 2]:
    print(item)

17. OverflowError(オーバーフローエラー)

⚡

症状:OverflowError: math range error
よくある原因:math.exp() などの結果が float の上限を超えた/巨大な int を float に変換した
まず試す1手:対数のまま計算するか、Decimal で計算する

浮動小数点数が表現できる最大値を超えたときに発生します。なお、Python の整数型(int)は任意精度なのでオーバーフローしません。

❌
エラーになるコード
import math

result = math.exp(1000)   # e^1000 は float で表現できない
# OverflowError: math range error

result = float(10 ** 400)  # int→float変換でオーバーフロー
# OverflowError: int too large to convert to float
✅
解決方法
import math
from decimal import Decimal

# 対数スケールで計算する
log_result = 1000 * math.log(math.e)   # log(e^1000) = 1000

# Decimal モジュールで高精度計算
result = Decimal(10) ** 400   # Decimal は任意精度

# try-except で対処
try:
    result = math.exp(1000)
except OverflowError:
    result = float("inf")   # 無限大として扱う

18. MemoryError(メモリエラー)

⚡

症状:MemoryError と表示されて止まる
よくある原因:巨大なリストを一度に作った/大きなファイルを read() で丸ごと読んだ
まず試す1手:for line in f で1行ずつ、CSV は chunksize で分けて読む

プログラムがメモリを使い果たしたときに発生します。巨大なデータを一度にメモリに読み込もうとすると起こりやすいです。

❌
エラーになるコード
# メモリを大量に使うコード例
huge_list = list(range(10 ** 9))   # 10億要素のリスト
# MemoryError

# 巨大ファイルを一括読み込み
with open("10gb_file.txt", "r") as f:
    content = f.read()   # 全内容をメモリに展開
# MemoryError
✅
解決方法
# 方法1: range やジェネレータを使う(メモリに全部展開しない)
huge_range = range(10 ** 9)   # range は必要になるまで値を作らない(遅延シーケンス)
for i in huge_range:
    if i > 100:
        break

# 方法2: ファイルを1行ずつ読む
with open("large_file.txt", "r", encoding="utf-8") as f:
    for line in f:           # 1行ずつ処理
        process(line.strip())

# 方法3: pandasのchunksize(大きなCSVを分割処理)
import pandas as pd
for chunk in pd.read_csv("large.csv", chunksize=10000):
    process(chunk)

# 方法4: 不要なオブジェクトを明示的に解放
del huge_list
import gc
gc.collect()

コードを工夫してもメモリが足りない、あるいは大きなデータ処理で動作が極端に重い場合は、搭載メモリ(RAM)不足など環境要因のこともあります。目安のスペックはPython学習・開発向けPCの選び方を参考にしてください。

19. RuntimeError(ランタイムエラー)

⚡

症状:RuntimeError: main thread is not in main loop
よくある原因:ウィンドウを閉じた後や mainloop() の開始前に、スレッドから GUI を操作した
まず試す1手:スレッドでは GUI に触らず結果を queue に入れ、メインスレッドの after() で受け取る/スレッドを daemon=True にする

実行時に様々な原因で発生する汎用エラーです。tkinter では、Python 公式ドキュメントに「tkinter はどのスレッドからも呼び出せる」とある一方、イベントループ(mainloop())が回っていないと、ほかのスレッドからの呼び出しは失敗すると書かれています。当サイトの実測では、出たのは「ウィンドウを閉じて mainloop() を抜けた後」と「mainloop() の開始前で、約1秒以内にループが始まらなかったとき」の2つでした(公式:Threading model、2026-10-22 確認)。

RuntimeError のよくある原因(tkinter を別スレッドから操作)

  • ウィンドウを閉じて mainloop() を抜けた後に、スレッド(threading)が Label の更新などを行った
  • mainloop() の開始前にスレッドからウィジェットを操作し、約1秒以内にループが始まらなかった
❌
エラーになるコード(tkinter)
import tkinter as tk
import threading

root = tk.Tk()
label = tk.Label(root, text="待機中")
label.pack()

def update_label():
    import time
    time.sleep(2)
    label.config(text="完了!")   # スレッド内からGUIを直接更新

thread = threading.Thread(target=update_label)  # daemon=False(既定)
thread.start()
root.mainloop()
# 2秒以内にウィンドウを閉じると、閉じた後に次のエラー
# RuntimeError: main thread is not in main loop

閉じずに2秒待てばラベルは「完了!」に変わり、エラーは出ません(Windows 11 の Python 3.14.7/3.12.10、Linux Mint 22.3 の Python 3.12.3 で実測)。

✅
解決方法(daemon=True + after() でメインスレッドへ渡す)
import tkinter as tk
import threading

root = tk.Tk()
label = tk.Label(root, text="待機中")
label.pack()

def background_task():
    import time
    time.sleep(2)
    # GUIの更新はafter()経由でメインスレッドに渡す
    root.after(0, lambda: label.config(text="完了!"))

thread = threading.Thread(target=background_task, daemon=True)
thread.start()
root.mainloop()

閉じた後のエラーを防いでいるのは daemon=True です(ウィンドウを閉じるとプロセスごとスレッドも終わります)。after(0, …) もスレッドからの呼び出しなので、閉じた後に呼ぶと同じエラーになります。

保存など途中で止まると困る処理は daemon にせず、スレッドでは GUI に触らずに結果を queue.Queue に入れ、メインスレッドの after() で取り出す形にしてください。

20. AssertionError(アサーションエラー)

⚡

症状:AssertionError: スコアが範囲外です: -5(assert の文言が出る)
よくある原因:assert の条件が False になった(値が前提を満たさない)
まず試す1手:出た値と条件式を見比べ、条件を満たす値を渡す

assert 文の条件が False になったときに発生します。デバッグや前提条件チェックに使われます。

❌
エラーになるコード
def divide(a, b):
    assert b != 0, "bはゼロ以外の値を指定してください"
    return a / b

result = divide(10, 0)
# AssertionError: bはゼロ以外の値を指定してください

score = -5
assert 0 <= score <= 100, f"スコアが範囲外です: {score}"
# AssertionError: スコアが範囲外です: -5
✅
解決方法
# assertのエラーメッセージを読んで、条件を満たす値を渡す
result = divide(10, 2)   # b != 0 を満たす値を渡す

score = 85
assert 0 <= score <= 100   # OK

# 本番コードではassertの代わりにValueErrorを使うのが推奨
def divide(a, b):
    if b == 0:
        raise ValueError("bはゼロ以外の値を指定してください")
    return a / b

# assert は -O(最適化)フラグで無効化されることに注意
# python -O script.py  → assertが全て無視される

21. ImportError(インポートエラー)

⚡

症状:ImportError: cannot import name 'X' from 'Y'
よくある原因:名前のスペルミス/循環インポート/自作ファイル名が標準ライブラリと同じ
まず試す1手:dir(モジュール) で正しい名前を確かめる

モジュール自体は見つかったものの、その中から指定した名前(関数・クラス・変数)を取り出せないときに発生します。「モジュールが丸ごと無い」場合の ModuleNotFoundError(§9) と混同しやすいので、メッセージで見分けます。

ImportError のよくある原因(名前のスペルミス・循環インポート)

  • インポートする名前のスペルミス、またはそのバージョンに存在しない名前を指定した
  • 2つのモジュールがお互いをインポートし合う「循環インポート」になっている
  • 自分のファイル名を標準ライブラリと同じ名前(例: random.py・json.py)にしてしまい、そちらが読み込まれた
❌
エラーになるコード
from math import square_root   # mathにこの名前は無い(正しくはsqrt)
# ImportError: cannot import name 'square_root' from 'math'

# 自作ファイルを random.py という名前で保存して実行した場合
import random
print(random.randint(1, 6))
# AttributeError や ImportError の原因になる
# (標準のrandomではなく自分のファイルが読み込まれるため)
✅
解決方法
# 正しい名前でインポートする
from math import sqrt
print(sqrt(16))   # 4.0

# そのモジュールに何があるか一覧で確認する
import math
print(dir(math))  # 使える関数名の一覧が見られる

# 自作ファイル名が標準ライブラリと被っていないか確認する
# random.py → my_random.py などにリネームし、
# 古いキャッシュ(__pycache__ フォルダ)が残っていれば削除する
💡
循環インポートの見分け方

メッセージに (most likely due to a circular import) と付く場合は、2つのファイルが互いを import し合っています。片方のインポートを関数の中に移す、共通部分を第3のファイルに分けるなどで解消できます。ライブラリのインストール状況を確認したいときは主要ライブラリ一覧もあわせてどうぞ。

22. KeyboardInterrupt(実行中断)

⚡

症状:Ctrl + C を押したあと、最終行に KeyboardInterrupt と表示される
よくある原因:自分で実行を止めた/意図しない無限ループに入り、手動で止めた
まず試す1手:止めた覚えがなければ、ループの終了条件(カウンタの更新忘れなど)を見直す

プログラムの実行中に Ctrl + C(Mac も Ctrl + C)を押して処理を止めたときに発生します。多くの場合はバグではなく、あなた自身が止めた合図です。ただし、意図せず無限ループに入ってしまい手動で止めたときにも出ます。

❌
発生する状況の例
while True:
    pass   # 何も進まない無限ループ

# 実行中に Ctrl + C を押すと…
# Traceback (most recent call last):
#   ...
# KeyboardInterrupt
✅
解決方法(安全に終了処理を入れる)
# Ctrl + C を受け取って、後片付けをしてから終了する
try:
    while True:
        # 長時間動かす処理など
        do_something()
except KeyboardInterrupt:
    print("\n中断されました。終了します。")
    # ここでファイルを閉じる・保存するなどの後始末を書く

# 無限ループが意図しないものなら、
# ループの終了条件(break や条件式)を見直す
count = 0
while count < 5:
    print(count)
    count += 1   # これを忘れると無限ループになる
⚠️
except の書き方に注意

裸の except:(=except BaseException:)は KeyboardInterrupt まで捕まえてしまい、Ctrl + C で止められなくなります。いっぽう except Exception: は KeyboardInterrupt を捕まえない(=Ctrl + C は効く)ので、まとめて例外を処理したいときは裸の except: は避けて except Exception: を使い、中断を自分で扱いたいときは except KeyboardInterrupt: と種類を明示しましょう。

例外の親子関係(例外階層)を知ると except が短くなる

ここまで22種類を個別に見てきましたが、Pythonの例外はばらばらに存在しているわけではなく、親子関係(クラスの継承関係)で整理されています。この関係を知っておくと、「似たエラーをまとめて捕まえる」「捕まえすぎを避ける」という書き分けができるようになります。

主要な例外の階層

Python公式ドキュメントの例外階層から、本ページで扱った22種類とその親クラスを抜き出したものです。

BaseException
 ├─ KeyboardInterrupt          ← Ctrl + C
 ├─ SystemExit                 ← sys.exit()
 ├─ GeneratorExit
 └─ Exception                  ← 通常のエラーはすべてこの下
     ├─ ArithmeticError
     │   ├─ OverflowError
     │   └─ ZeroDivisionError
     ├─ AssertionError
     ├─ AttributeError
     ├─ ImportError
     │   └─ ModuleNotFoundError
     ├─ LookupError
     │   ├─ IndexError
     │   └─ KeyError
     ├─ MemoryError
     ├─ NameError
     │   └─ UnboundLocalError
     ├─ OSError
     │   ├─ FileNotFoundError
     │   └─ PermissionError
     ├─ RuntimeError
     │   └─ RecursionError
     ├─ StopIteration
     ├─ SyntaxError
     │   └─ IndentationError
     │       └─ TabError
     ├─ TypeError
     └─ ValueError
         └─ UnicodeError
             ├─ UnicodeDecodeError
             └─ UnicodeEncodeError

※ 主要なものだけを抜き出した抜粋です。すべての例外はPython公式ドキュメント「組み込み例外 — 例外階層」で確認できます。

親クラスを指定すると、子もまとめて捕まる

except に親クラスを書くと、その下にぶら下がる子クラスもすべて捕まります。よく使う組み合わせは次の通りです。

親クラスまとめて捕まる主な例外使いどころ
LookupErrorIndexError / KeyErrorリストの添字と辞書のキー、どちらの取り出しミスも同じ扱いにしたいとき
ArithmeticErrorZeroDivisionError / OverflowError計算の失敗をまとめて処理したいとき
ImportErrorModuleNotFoundError「ライブラリが無ければ代替処理」を書くとき
OSErrorFileNotFoundError / PermissionErrorファイル操作の失敗をまとめて処理したいとき
ValueErrorUnicodeDecodeError / UnicodeEncodeError値の不正と文字コードの失敗を同じ扱いにしたいとき
NameErrorUnboundLocalError実務ではまとめずに、原因を直すほうが先です
✅
親クラスでまとめる書き方
data = {"apple": 100}
items = ["apple"]

# 添字ミスもキーミスも LookupError ひとつで受け止められる
try:
    print(items[5])
    print(data["banana"])
except LookupError as e:
    print(type(e).__name__, e)
    # IndexError list index out of range

# ライブラリが無ければ代替処理へ
try:
    import ujson as json_lib
except ImportError:
    import json as json_lib   # ModuleNotFoundError もここで捕まる

except を並べるときは「子 → 親」の順に書く

except は上から順に照合され、最初に当てはまった1つだけが実行されます。そのため親クラスを先に書くと、後ろに書いた子クラスの節には決して到達しません。個別に処理を分けたいときは必ず子を先に書いてください。

❌
親が先だと子に届かない
try:
    [1][9]
except LookupError:
    print("LookupError の節が実行される")
except IndexError:
    print("ここには絶対に来ない")   # IndexError は LookupError の子
✅
子を先に書く
try:
    [1][9]
except IndexError:
    print("IndexError の節が実行される")   # こちらが選ばれる
except LookupError:
    print("IndexError 以外の取り出しミスはこちら")
⚠️
「なんでも捕まえる」は BaseException ではなく Exception で

階層の一番上は Exception ではなく BaseException です。上の図のとおり KeyboardInterrupt(Ctrl + C)と SystemExit(sys.exit())は Exception の外側にあるため、except Exception: ではこの2つは捕まりません。これは欠点ではなく、Ctrl + C での中断と sys.exit() での終了が邪魔されないようにするための設計です。裸の except: は BaseException を捕まえてしまい、プログラムを止められなくなるので避けましょう(§22もあわせてどうぞ)。

💡
SyntaxError は try では捕まえられない

階層上は SyntaxError も Exception の子ですが、自分のファイルに書いた構文エラーは try で囲んでも捕まりません。構文チェックは実行が始まる前に行われるため、try の行に到達する前にプログラムが止まるからです。SyntaxError を except で受け取れるのは、import した別ファイルや compile() で後から読み込むコードに構文エラーがあった場合に限られます。

エラー対処の基本ステップ

📋
エラーが出たときの確認手順
  1. エラーの最終行を読む(エラーの種類と説明)
  2. File "〜.py", line XX でエラー行を確認
  3. エラー行とその前後のコードを確認する
  4. 変数の型・値を print() で出力して確認する
  5. それでも解決しない場合はエラーメッセージを検索する
🎉
次はGUIアプリを作ってみよう!

エラーへの対処法を覚えたら、実際にアプリを作りながら練習しましょう。

初心者アプリ一覧を見る →

よくある質問(FAQ)

エラーの調べ方について、学習中によく出てくる疑問をまとめました。

Q. エラーメッセージはどこから読めばいいですか?

一番下の行からです。最終行にエラーの種類と内容が書かれているので、まずそこを読みます。次に、下から2つ目の File 行を見れば、どのファイルの何行目で落ちたかが分かります。上から順に読むと呼び出し経路をたどることになり遠回りです。詳しい手順はトレースバックの読み方の章で図解しています。

Q. 英語のエラーメッセージは日本語に翻訳してから検索したほうがいいですか?

翻訳せず、英語のまま検索するのが基本です。エラーメッセージは世界共通の文字列なので、英語のまま検索したほうが情報量が段違いに多くなります。検索するときは、クォートで囲まれた部分(自分の変数名やファイル名)を外して共通部分だけを使い、先頭に python を付けると精度が上がります。

Q. SyntaxError と IndentationError は何が違いますか?

IndentationError は SyntaxError の子クラスで、構文エラーのうち字下げが原因のものだけを指します。つまり IndentationError はすべて SyntaxError の仲間です。さらにタブとスペースが混在している場合は、IndentationError の子である TabError になります。どれも実行が始まる前に検出されるため、1つでもあるとファイルは1行も実行されません。

Q. AttributeError と NameError の違いは何ですか?

ドットの左右で切り分けられます。NameError は名前そのものが存在しないエラーで、prnt("hello") のようなスペルミスで起きます。AttributeError はオブジェクト自体は存在するのに、そのドットより後ろのメソッドや属性が無いエラーで、math.sqr(4) のように起きます。Python 3.10 以降はどちらも Did you mean: の形で正しい候補を提示してくれるので、まずその候補を試すのが早道です。ただし Jupyter・Colab(IPython)では、この候補表示が出ないことがあります。IPython が独自のエラー表示を使うためで、Python公式の「What's New In Python 3.10」にも、独自の表示関数を使う IPython のような REPL では候補が出ない、と注意書きがあります。候補を見たいときは .py ファイルとして実行し直してください。

Q. try / except はいつ使えばいいですか?

起きることが事前に分かっていて、自分のコードでは防げない失敗に使います。ファイルが存在しない、ネットワークがつながらない、利用者が数字以外を入力した、といった外部要因が対象です。逆に、変数名のスペルミス(NameError)や型の取り違え(TypeError)は自分のコードのバグなので、except で隠さずコードを直してください。使うときは except の後ろに例外の種類を必ず書き、何を想定した処理なのかを明示します。

Q. 同じエラーが何度直しても消えないときは何を疑えばいいですか?

直したつもりのコードが実行されていない可能性があります。確認する順番は、ファイルを保存したか、トレースバックの File 行のパスが編集中のファイルと一致しているか、実行している Python が意図した環境かの3点です。3つ目は python -c "import sys; print(sys.executable)" で実際に動いている Python の場所を表示すると確認できます。仮想環境の有効化を忘れているケースがよくあります。

Q. incomplete input という表示は特別なエラーですか?

特別なものではなく SyntaxError の一種です。ただし表示される場所が限られていて、Jupyter Notebook や Google Colab のように内部で IPython を使うセル実行環境で出ます。同じコードをファイルとして実行すると、括弧の閉じ忘れなら '(' was never closed のように、より具体的なメッセージに変わります。原因が分からないときは .py ファイルにコピーして実行し直すと特定が早くなります。

Q. エラーは出ないのに結果が間違っているときはどうすればいいですか?

文法と型は通っていて、考え方のほうが間違っている状態です。この場合 Python は何も教えてくれないので、処理を分割して途中の値を print() で表示し、どこから想定と違うかを挟み撃ちで探します。値だけでなく type() で型も一緒に出すと、文字列と数値の取り違えのような原因に気づきやすくなります。

解決したら次に読む

同じ種類のエラーを何度も出すなら、その文法を使うお題で練習すると減らせます。

広告について:本ページの書籍紹介枠(PR)内の「楽天市場で見る」「Amazonで見る」は、もしもアフィリエイト経由の広告リンクです。リンク経由で購入されると、運営者が提携先から報酬を受け取ることがあります。Amazonのアソシエイトとして、当サイト(PythonLand)は適格販売により収入を得ています。

書籍の選定は報酬額と無関係です。紹介は目次と出版社の公表情報にもとづくもので、通読した評価ではありません。価格・在庫はリンク先でご確認ください。