Pythonで文字列のSyntax Error(シンタックスエラー)が出たときの対処法

スポンサーリンク

Pythonはインタプリタ型言語であり、基本的にはプログラム全体を一度に低レベルのコードに変換するのではなく、コードの各行を1つずつ実行することを意味します。

Pythonのインタプリタは、コードの各行をスキャンして何か普通でないものを見つけると、シンタックスエラーと呼ばれるエラーを発生させます。

このエラーは、「括弧の欠落」「引用符の欠落」など、構文上の基本的な異常によって発生することがあります。

今回取り上げるSyntax Errorは、「文字列リテラルのスキャン中のEOL」です。

スポンサーリンク

このエラーは何を意味するのでしょうか?

私たちは、問題を効果的に理解しない限り、問題を解決することはできません。

EOLは “End of Line “の略です。

このエラーは、Pythonインタープリターが文字列リテラルをスキャンしようとしたときに行末に到達したことを意味します。

文字列リテラル(定数)は、シングルクォーテーションとダブルクォーテーションで囲む必要があります。

スキャン中に「行末」に達するとは、文字列の最後の文字に達し、終了引用符に遭遇しないことを指します。

# String value
s = "This is a string literal...
 
# Printing the string
print(s)

上記のコードを実行すると、次のような出力が得られます。

  File "EOL.py", line 2
    s = "This is a string literal...
                                   ^
SyntaxError: EOL while scanning string literal

小さな矢印は文字列の最後の文字を指しており、文のそのコンポーネントを解析する際にエラーが発生したことを示しています。

さて、この問題を理解したところで、Pythonコードの実行中にこの問題が発生するいくつかの例を見てみましょう。

How to Fix “Syntax Error: 文字列リテラルのスキャン中にEOLが発生”

このエラーに遭遇する主な状況は、4つ考えられます。

エンディングクォーテーションの欠落

上記のコードで説明したように、Pythonインタープリタは文字列リテラルの末尾に到達し、引用符がないことを発見するとシンタックスエラーを発生させます。

# Situation #1
 
# Missing the ending quotation mark
s = "This is a string literal...
 
# Printing the string
print(s)

このシンタックスエラーの理由は非常に明白です。

どの言語にも基本的な構文ルールがあり、それに違反するとエラーになるのです。

解決策

簡単な解決策は、構文規則を守り、最後に引用符を付けることです。

# Solution #1
 
# Place the ending quotation mark
s = "This is a string literal..."
 
# Printing the string
print(s)

誤った終了引用符の使用

Python では、文字列定数を囲むために ' '" " を使用することができます

時々、プログラマは文字列の値を終了するために間違った引用符の対応するものを使用します。

# Situation #2
 
# Incorrect ending quotation mark
s = "This is a string literal...'
 
# Printing the string
print(s)

文字列が囲まれているように見えても、そうではありません。

Pythonインタプリタは、文字列の末尾に一致する引用符を探します。

解決方法

基本的な解決策は、開始と終了の引用符を一致させることです。

#       Solution #2
 
# Match the quotation marks
s = "This is a string literal..."
 
# Printing the string
print(s)

文字列定数の複数行への引き伸ばし

初心者のPythonプログラマの多くは、ステートメントを複数行に伸ばすというミスを犯します。

Python は改行を文の終わりと見なしますが、C++ や Java は ';' を文の終わりと見なします。

#       Situation #3
 
# String extending to multiple lines
s = "This is a string literal...
          Going to the next line"
 
# Printing the string
print(s)

最初は普通のコードに見えるかもしれませんが、改行が始まるとすぐにPythonインタープリタはそのステートメントを終了させ、文字列定数を囲んでいないというエラーを発生させます。

解決策1:

エスケープシーケンス 'n' を使用すると、文字列定数に改行の効果を与えることができます。

他のエスケープシーケンスについては、こちらを参照してください。

#       Solution #3.1
 
# Using the escape sequences
-> Newline
s = "This is a string literal...
Going to the next line"
 
# Printing the string
print(s)

解決策2:

もう一つの解決策は、複数行の文字列リテラルを格納するために、三重引用符、 ''' または """ を使用することです。

#       Solution #3.2
 
# Using triple quotation marks
s = """This is a string literal...
          Going to the next line"""
 
# Printing the string
print(s)

終了クォーテーションマークの前にバックスラッシュを使う

バックスラッシュ '' は文字列をエスケープする役割があり、構文エラーを引き起こします。

#       Situation #4
 
# Storing a directory path
s = "homeUserDesktop"
 
# Printing the string
print(s)

引用符の前の最後のバックスラッシュは文字列定数をエスケープし、Pythonインタープリタは "int"を1つの文字として扱います。

このエスケープシーケンスは、引用符 (") に変換されます。

解決策

バックスラッシュをバックスラッシュ () のエスケープシーケンスに置き換えることで解決します。

#       Solution #4
 
# Storing a directory path
s = "homeUserDesktop"
 
# Printing the string
print(s)

まとめ

1,000行に及ぶコードに1つのエラーがあると、デバッグに何時間もかかってしまいます。

したがって、このようなコードは、細心の注意を払い、正しい構文で書くことをお勧めします。

この記事が読者のエラーを解決するために有益であったことを願っています。

お読みいただきありがとうございました。

タイトルとURLをコピーしました