はじめに
Pythonで文字列の操作をしていると
SyntaxError: EOL while scanning string literal
というエラーメッセージが表示されました。
文字列操作はよく行いますし、このエラーはよく見るものの一つではないかと。
なので、このエラーの原因と対処方法をメモすることにしました。
エラー
エラーが表示される例の簡単なプログラムです。
プログラムでは文字列の文字数を数えるというシンプルなものです。
文字列の例として、青空文庫より夢野久作のドグラ・マグラを利用させてもらっています。
text = "
胎児よ
胎児よ
何故躍る
母親の心がわかって
おそろしいのか
…………ブウウ——————ンンン——————ンンンン………………。
私がウスウスと眼を覚ました時、こうした蜜蜂の唸るような音は、まだ、その弾力の深い余韻を、私の耳の穴の中にハッキリと引き残していた。
それをジッと聞いているうちに……今は真夜中だな……と直覚した。そうしてどこか近くでボンボン時計が鳴っているんだな……と思い思い、又もウトウトしているうちに、その蜜蜂のうなりのような余韻は、いつとなく次々に消え薄れて行って、そこいら中がヒッソリと静まり返ってしまった。
私はフッと眼を開いた。"
print(len(text))
これを実行すると、
File "/Users/****/Desktop/python/long_str.py", line 2
text = "
^
SyntaxError: EOL while scanning string literal
とエラーメッセージが表示されます。
エラーを訳すと
「文法エラー:文字列リテラルチェックしていると行末になりました」
と言っています。
原因&対処
エラーの内容が少し分かりづらいですね。
まずこのエラーですが、””や”が抜けている事などよく起きます。
文字列はシングル、ダブルクオートでくくられていないといけないからです。
しかし今回はダブルクオートで文字列がくくられています。
が、””内で改行をしているためエラーが発生しています。
改行が入った複数の文字列を使う場合、別途対応が必要です。
対処方法として、
- “”” “””とダブルクオートを3つ使って文字列をくくる
- 改行ごとに「\」を入れて明示的に文字列が続いていることをプログラムに教える
といった処理が必要になります。
次の2つは、エラーが出ずに上手くプログラムが実行される例です。
“”” “””を使った場合
text = """
胎児よ
胎児よ
何故躍る
母親の心がわかって
おそろしいのか
…………ブウウ——————ンンン——————ンンンン………………。
私がウスウスと眼を覚ました時、こうした蜜蜂の唸るような音は、まだ、その弾力の深い余韻を、私の耳の穴の中にハッキリと引き残していた。
それをジッと聞いているうちに……今は真夜中だな……と直覚した。そうしてどこか近くでボンボン時計が鳴っているんだな……と思い思い、又もウトウトしているうちに、その蜜蜂のうなりのような余韻は、いつとなく次々に消え薄れて行って、そこいら中がヒッソリと静まり返ってしまった。
私はフッと眼を開いた。"""
print(len(text))
「\」を各行に入れた例
text = "\
胎児よ\
\
胎児よ\
\
何故躍る\
\
母親の心がわかって\
\
おそろしいのか\
…………ブウウ——————ンンン——————ンンンン………………。\
私がウスウスと眼を覚ました時、こうした蜜蜂の唸るような音は、まだ、その弾力の深い余韻を、私の耳の穴の中にハッキリと引き残していた。\
それをジッと聞いているうちに……今は真夜中だな……と直覚した。そうしてどこか近くでボンボン時計が鳴っているんだな……と思い思い、又もウトウトしているうちに、その蜜蜂のうなりのような余韻は、いつとなく次々に消え薄れて行って、そこいら中がヒッソリと静まり返ってしまった。\
私はフッと眼を開いた。"
print(len(text))
どちらを実行してもプログラムは通ります。
個人的には文字列の場合は””””””を使った方が楽なのでおすすめです。
(ただ、「/」は文字列以外のコードの部分でも実行出来ますので、用途にわけて使うと良いでしょう)
さいごに
今回は複数行の文字列で起きたエラーメッセージについてでした。
ダブルクオートやシングルクオートのつけ忘れなどでもこのエラーメッセージが出るので、メッセージが表示されたら、「何か文字列の問題だな」とアタリをつけると対処しやすいかと思います。
この記事がお役に立ったのならば嬉しいです。
最後までお読みいただきありがとうございました。