How to fix "SyntaxError: EOL while scanning string literal" in Python
Reza Lavarian
Posted on February 2, 2023
✋ Update: This post was originally published on my blog decodingweb.dev, where you can read the latest version for a 💯 user experience. ~reza
Python raises “SyntaxError: EOL while scanning string literal” when it reaches the end of the line, yet it hasn’t encountered the closing quotation mark ('
or "
) of a string literal.
This syntax error usually occurs owing to a missing quotation mark or an invalid multi-line string. Here’s what the error looks like:
File test.py, line 1
book_title = 'Head First Python
^
SyntaxError: EOL while scanning string literal
Please note this is a Python 2.7 error. Python 3 displays a slightly different error for EOL and string literals.
The term "string literal" refers to every string value in your source code, like 'Head First Python'
, '49.99'
, 'test'
, etc.
Python is an interpreted language that executes lines one after another. So every statement is assumed to be on one line. The new line marks the end of a Python statement and the beginning of another.
However, you can write loops and conditional statements in multiple lines. You can even store multi-line strings literals by using triple quotes ("""
). You can also write multi-line statements by placing a \
at the end of each line (except for the last line).
EOL (End of Line) in an error message usually means Python's interpreter was expecting a symbol - like a quotation mark or a bracket - but it couldn't find any, even until the end of the line.
And the error "EOL while scanning string literal" means Python was expecting a closing quotation mark, but it didn't encounter any:
# 🚫 Raises: SyntaxError: EOL while scanning string literal
book_title = 'Head First Python
Adding the missing quotation mark resolves the issue instantly:
# ✅ Correct
book_title = 'Head First Python'
Let's explore common scenarios that lead to this SyntaxError.
How to fix "SyntaxError: EOL while scanning string literal"
The error "SyntaxError: EOL while scanning string literal" occurs under various scenarios:
- Forgetting to close a string literal with a quotation mark
- Having a
\
right before the closing quotation mark - Open and closing quotation marks don't match
- Having a multi-line string value enclosed with
"
or'
- A missing slash!
- Multi-line strings need triple quotes, not quadruple!
Forgetting to close a string literal with a quotation mark: The most common reason behind this error is to forget to close your string with a quotation mark - whether it's a single, double, or triple quotation mark.
# 🚫 Raises: SyntaxError: EOL while scanning string literal
book_title = 'Head First Python
Needless to say, adding the missing end fixes the problem:
# ✅ Correct
book_title = 'Head First Python'
Having a \
right before the closing quotation mark: Based on Python semantics, a pair of quotation marks work as a boundary for a string literal.
Putting a backslash before a quotation mark will turn it into an ordinary character - without any special behavior.
This is helpful when you want to include a quotation mark in your string, but you don't want it to interfer with its surrounding quotation marks:
message = 'I\' m good'
That said, if you use the backslash before the ending quotation mark, it won't be a boundary character anymore.
Imagine you need to define a string that ends with a \
like a file path on Windows
# 🚫 Raises: SyntaxError: EOL while scanning string literal
file_dir = 'C:\files\'
In the above code, the last \
escapes the quotation mark's behavior, making our string open-ended.
As a result, Python raises "SyntaxError: EOL while scanning string literal".
To fix it, we use a double backslash \\
instead of one. As you probably know, the first \
escapes the effect of its following slash, and as a result, we'll have our slash in the string (as an ordinary character), and the quoting behavior of '
remains intact.
# ✅ Escaping a slash in a string literal
file_dir = 'C:\files\\'
Open and closing quotation marks don't match: The opening and closing quotation marks must be identical, so if the opening is "
, the closing must be "
too. The following code raises the error:
# 🚫 Raises: SyntaxError: EOL while scanning string literal
book_title = "Python Head First'
No matter which one you choose, they need to be identical:
# ✅ Opening and closing quotation marks match
book_title = 'Python Head First'
Having a multi-line string value enclosed with "
or '
: If you use '
or "
to quote a string literal, Python will look for the closing quotation mark on the same line. So if you define a string literal in multiple lines enclosed in single or double quotes, you'll get the syntax error:
# 🚫 Raises: SyntaxError: EOL while scanning string literal
message = 'Python is a high-level,
general-purpose
programming language'
In the above code, the first line doesn't end with a quotation mark.
If you want a string literal to span across several lines, you should use the triple quotes ("""
or '''
) instead:
# ✅ The correct way of defining multi-line strings
message = '''Python is a high-level,
general-purpose
programming language'''
Multi-line strings need triple quotes, not quadruple: As mentioned earlier, to create multi-line strings, we use triple quotes. But what happens if you use quadruple quotes?
The opening would be ok, as the fourth quote would be considered a part of the string. However, the closing part will cause a SyntaxError.
Since Python expects the closing part to be triple quotes, the fourth quotation mark would be considered a separate opening - without an end part.
# 🚫 Raises: SyntaxError: EOL while scanning string literal
message = ''''Python is a high-level,
general-purpose
programming language''''
Always make sure you're not using quadruple quotes by mistake.
A missing slash: Another way to span Python statements across multiple lines is by marking each line with a backslash. This backslash (\
) escapes the hidden newline character (\n
) and makes Python keeps parsing the lines until it reaches a newline character.
You can use this technique as an alternative to the triple quotes:
# ✅ The correct way of defining multi-line strings with '\'
message = 'Python is a high-level, \
general-purpose \
programming language'
Now, if you forget the \
in the second line, Python will expect to see the closing quotation mark on that line:
# 🚫 Raises: SyntaxError: EOL while scanning string literal
message = 'Python is a high-level, \
general-purpose
programming language'
If you're taking this approach, all lines should end with \
except for the last line, which ends with the closing quotation mark.
✋ Please note: Since the \
is supposed to escape the newline character (the hidden last character), no space should follow the \
. In that case, the newline character wouldn't be affected, and Python will expect the statement to end on that line.
Alright, I think it does it. I hope this quick guide helped you solve your problem.
Thanks for reading.
❤️ You might like:
- TypeError: can only concatenate str (not “float”) to str (solutions)
- TypeError: can only concatenate str (not “int”) to str (Solutions)
- TypeError: can only concatenate str (not "bool") to str (Fixed)
- TypeError: can only concatenate str (not "dict") to str (Fixed)
- TypeError: can only concatenate str (not "list") to str (Fixed)
Posted on February 2, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.