Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの「EOL while scanning string literal」エラーの原因と解決方法を徹底解説

経験豊富な開発者でも、コーディング中に構文エラーを起こすことは珍しくありません。プログラミング言語には多くのルールがあり、ほんの小さなタイプミスひとつでエラーが発生してしまうからです。

「syntaxerror: EOL while scanning string literal」というエラーに遭遇しても、心配はいりません。この記事では、このエラーの意味と解決方法を詳しく解説します。具体的な事例を挙げながら、原因の特定方法と対処法を見ていきましょう。

問題:「syntaxerror: EOL while scanning string literal」とは

構文(シンタックス)とは、プログラミング言語における「文法」のようなものです。英語に句読点やスペルに関するルールがあるように、プログラミング言語にも同様のルールが存在します。

まず、今回のエラーメッセージを見てみましょう。

syntaxerror: EOL while scanning string literal

SyntaxErrorというメッセージは、Pythonの構文ルールに従っていないことを示しています。

エラーの説明部分によると、Pythonは行末(End Of Line)までに特定の文字が出現することを期待していたのに、それが見つからなかったことを意味します。たとえば、文字列を開始したのに、その行の終わりまでに文字列を閉じる引用符(")が見つからないケースなどが該当します。

構文エラーが検出されると、Pythonはプログラムの実行を停止します。これは、Pythonインタープリターが残りのコードを読み進める前に、問題を修正する必要があるためです。

このエラーの主な原因は以下の3つです。

  • 誤った構文で複数行にまたがる文字列を記述している
  • 引用符(クォーテーションマーク)の閉じ忘れ
  • 開始と終了で異なる種類の引用符を使用している

事例1:複数行文字列の誤った記述

Pythonでは、文字列を複数行にまたがって記述することができます。ただし、複数行文字列の構文は通常の文字列とは異なり、三重引用符(トリプルクォート)で囲む必要があります。

複数行文字列の例を見てみましょう。

def welcome_hero():
	message = "Welcome, Hero!
You have just entered the Castle of Doom. Your challenge, should you choose to accept it, is to locate the Sacred Emerald and take it back to the travelling salesman."
	print(message)

welcome_hero()

ここでは、welcome_hero()という関数を定義し、変数「message」に代入されたメッセージをコンソールに出力しています。

このコードを実行してみましょう。

File "main.py", line 2
	message = "Welcome, Hero!
                        	^
SyntaxError: EOL while scanning string literal

エラーが返されました。これは、シングルクォートやダブルクォートで囲まれた文字列は複数行にまたがれないためです。この問題を解決するには、文字列を3つのシングルクォートまたはダブルクォートで囲みます。これらの記号の間にあるテキストはすべて文字列の一部として扱われます。

message = """Welcome, Hero!
You have just entered the Castle of Doom. Your challenge, should you choose to accept it, is to locate the Sacred Emerald and take it back to the travelling salesman."""

修正したコードを実行すると、次の出力が得られます。

Welcome, Hero!
You have just entered the Castle of Doom. Your challenge, should you choose to accept it, is to locate the Sacred Emerald and take it back to the travelling salesman.

成功です!エラーなくメッセージが出力されました。

事例2:引用符の閉じ忘れ

文字列は、内容を記述した後に必ず閉じる必要があります。閉じ忘れると、Pythonは構文エラーを返します。閉じられていない文字列の例を見てみましょう。

def welcome_hero():
	message = "Welcome, Hero!
	print(message)

welcome_hero()

コードを実行してみます。

File "main.py", line 2
	message = "Welcome, Hero!
                        	^
SyntaxError: EOL while scanning string literal

文字列を閉じるのを忘れています。「message」変数を宣言している行を見ると、文字列を閉じる引用符が存在しません。

このエラーを修正するには、文字列を開いたときに使用した同じ種類の引用符で文字列を閉じます。

def welcome_hero():
	message = "Welcome, Hero!"
	print(message)

welcome_hero()

もう一度コードを実行しましょう。

Welcome, Hero!

今度は正常に実行されました。

事例3:引用符の種類の不一致

文字列を開くときに使用した引用符の種類は、閉じるときに使用する引用符の種類と一致している必要があります。

開始と終了で異なる種類の引用符を使用すると、構文エラーが発生します。シングルクォート(')で文字列を開き、ダブルクォート(")で閉じているプログラムの例を見てみましょう。

def welcome_hero():
	message = 'Welcome, Hero!"
	print(message)

welcome_hero()

コードを実行すると、次の結果になります。

File "main.py", line 2
	message = 'Welcome, Hero!"
                         	^
SyntaxError: EOL while scanning string literal

この問題は、引用符の種類を揃えることで解決できます。最初の引用符をダブルクォート(")に変更してみましょう。

def welcome_hero():
	message = "Welcome, Hero!"
	print(message)

welcome_hero()

コードは正常に実行され、「Welcome, Hero!」と出力されます。

まとめ

「syntaxerror: EOL while scanning string literal」エラーは、すべてのPython開発者が一度は経験するエラーです。このエラーは以下の場合に発生します。

  • 文字列を閉じ忘れている
  • 誤った記号で文字列を閉じている
  • 複数行文字列を3つの引用符ではなく1つの引用符で宣言している

このエラーを解決するには、上記の条件に該当する箇所がないかコードを確認し、必要な修正を加えましょう。これで、Pythonの専門家のようにこのエラーを解決できるはずです!

  1. Pythonのcasefold()メソッドとは?文字列の小文字変換と比較方法を解説

    Pythonのcasefold()は、文字列内の英字をすべて小文字に変換するためのメソッドです。lower()と似ていますが、より積極的な変換を行う点が特徴で、ドイツ語の「ß」が「ss」に変換されるなど、国際化対応において強力な働きをします。2つの文字列に対してcasefold()を適用すれば、大文字・小文字の違いを無視して値を一致させることができます。そのため、ユーザー入力の比較や検索処理などで非常に役立ちます。casefold()の基本的な使い方次の例では、文字列にcasefold()を適用し、すべて小文字に変換された結果を出力しています。コード例string = BestTutorial

  2. Pythonの文字列リテラルの先頭に付く「b」とは?意味と役割をわかりやすく解説

    「b」プレフィックスの基本的な意味Pythonで文字列リテラルの先頭に付ける「b」または「B」は、そのリテラルがバイト列(bytes型)であることを示すプレフィックスです。この記号の挙動は、Python 2とPython 3で大きく異なるため、注意が必要です。Python 2での扱いPython 2では、「b」や「B」のプレフィックスは単純に無視されます。Python 2では通常の文字列リテラル自体がバイト列として扱われるため、「b」を付けても付けなくても動作に違いはありません。Python 3での扱い一方、Python 3ではバイト列リテラルには必ず「b」または「B」を前置します。「b」を付