HOWTO · Python
EOL beim Scannen von String-Literalen in Python
Eine häufige Ursache für den EOL-Fehler beim Scannen des String-Literals ist ein Backslash direkt vor dem vermeintlich schließenden Anführungszeichen: Er maskiert das Anführungszeichen, sodass der Parser weiter nach dem Ende der Zeichenkette sucht.
Auf dieser Seite
Die ältere Diagnose EOL while scanning string literal bedeutet, dass Python beim Parsen einer nicht geschlossenen Zeichenkette das Zeilenende erreicht hat. Neuere Python-Versionen bezeichnen dasselbe Problem möglicherweise als nicht abgeschlossenes Zeichenkettenliteral; der genaue Wortlaut hängt daher vom Interpreter ab. Eine häufige Ursache ist ein Backslash direkt vor dem vermeintlich schließenden Anführungszeichen: Dieser Backslash maskiert das Anführungszeichen, und der Parser sucht weiter nach dem Ende der Zeichenkette.
Auch ein nicht geschlossenes öffnendes Anführungszeichen oder ein nicht zusammenpassendes Anführungszeichenpaar kann dazu führen, dass eine Zeichenkette offen bleibt. Prüfe zunächst die in der Fehlermeldung genannte Quelltextzeile. Kontrolliere dann die öffnenden und schließenden Begrenzer der Zeichenkette sowie Backslashes direkt vor dem vermeintlichen Schlusszeichen.
Was der EOL-Fehler bei Zeichenkettenliteralen bedeutet
Python markiert Anfang und Ende einer Zeichenkette mit Anführungszeichen. In einer gewöhnlichen Zeichenkette leitet ein Backslash eine Escape-Sequenz ein; \\ steht für einen einzelnen literalen Backslash. Ein Anführungszeichen, vor dem eine ungerade Anzahl von Backslashes steht, ist maskiert und schließt die Zeichenkette daher nicht. Deshalb kann der Parser einen Fehler wegen des Zeilenendes melden, obwohl die sichtbare Zeile scheinbar ein schließendes Anführungszeichen enthält.
Zum Beispiel bleibt im Inline-Fragment path = "C:\logs\" das Anführungszeichen maskiert. Es wird absichtlich als Inline-Text gezeigt, weil es ungültiges Python ist und sich nicht als vollständiges Beispiel ausführen lässt. Entscheidend ist der Unterschied zwischen der Schreibweise im Quelltext und dem von Python erzeugten Wert: Im Quelltext muss die Anzahl der Backslashes zum gewünschten Wert passen.
Warum eine rohe Zeichenkette nicht mit einem Backslash enden kann
Das Präfix r oder R weist Python an, Backslashes im Zeichenkettenwert beizubehalten, statt die meisten Escape-Sequenzen auszuwerten. Die Regeln für Anführungszeichen gelten trotzdem. Auch in einem rohen Literal kann ein Backslash beim Parsen des Quelltexts ein Anführungszeichen maskieren. Deshalb ist r"C:\logs\" ungültig: Der letzte Backslash maskiert das vermeintlich schließende Anführungszeichen, sodass das Literal offen bleibt.
Ein rohes Literal kann daher nicht mit einer ungeraden Anzahl von Backslashes enden. Ein rohes Literal mit einer geraden Anzahl kann gültig sein, ergibt aber genau diese gerade Anzahl von Backslashes. Es eignet sich also nicht, um einen Wert zu schreiben, der mit genau einem Backslash endet. Verwende ein rohes Literal für den Teil, bei dem die rohe Schreibweise hilfreich ist, und hänge bei Bedarf einen separat maskierten Backslash an.
Zeichenkettenliteral korrigieren
Für einen Wert, der mit einem Backslash endet, kannst du entweder den letzten Backslash in einer gewöhnlichen Zeichenkette maskieren oder einen Backslash an eine rohe Zeichenkette anhängen, die selbst nicht mit einem Backslash endet. Beide Zuweisungen ergeben denselben Zeichenkettenwert: einen Pfad mit genau einem Backslash vor logs und einem abschließenden Backslash. Die Schreibweise C:\logs\ zeigt diesen Wert in der Form, in der Backslashes verdoppelt sind; der tatsächliche Wert enthält jeweils nur einen Backslash. repr stellt ihn als 'C:\\logs\\' dar und verdoppelt dabei jeden Backslash, damit er sichtbar ist:
Führe dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
folder = "C:\\logs\\"
raw_folder = r"C:\logs" + "\\"
print(repr(folder))
print(repr(raw_folder))
'C:\\logs\\'
'C:\\logs\\'
repr macht die Backslashes in der angezeigten Darstellung sichtbar. Bei der ersten Zuweisung stehen im Quelltext für jeden Backslash im Wert zwei Backslashes. Die zweite Zuweisung hält den Verzeichnisteil als rohe Zeichenkette gut lesbar und fügt den abschließenden Backslash mit einem gewöhnlichen Zeichenkettenliteral hinzu. Zum Kombinieren oder Bearbeiten von Pfadteilen verwendest du am besten eine Pfadbibliothek. Diese Beispiele zeigen, wie Python Zeichenkettenliterale parst.
Anführungszeichen prüfen und die Korrektur verifizieren
Wenn die Anzahl der Backslashes stimmt, prüfe, ob öffnende und schließende Anführungszeichen zusammenpassen. Zum Beispiel beginnt message = "That string ends here' mit einem doppelten Anführungszeichen, hat aber kein passendes doppeltes Anführungszeichen zum Schließen. Python kann den Apostroph nicht als schließenden Begrenzer verwenden. Korrigiere den Quelltext zu message = "That string ends here" oder setze die gesamte Zeichenkette in passende einfache Anführungszeichen.
Wenn die Diagnose weiterhin auftritt, hilft diese kurze Prüfung:
- Suche die gemeldete Zeile und bestimme das öffnende Anführungszeichen.
- Prüfe, ob ein passendes Anführungszeichen die Zeichenkette vor dem Zeilenende schließt.
- Zähle die aufeinanderfolgenden Backslashes direkt davor; eine ungerade Anzahl maskiert das Anführungszeichen.
- Verwende für einen Wert, der mit einem Backslash endet, eine gewöhnliche Zeichenkette mit maskiertem Backslash oder hänge einen Backslash an ein rohes Zeichenkettenpräfix an.
- Führe den korrigierten Quelltext erneut aus. Falls noch ein Syntaxfehler auftritt, beachte die neue Fehlerstelle.
Der zitierte Wortlaut kann helfen, ältere Diskussionen und Beispiele zu finden. Maßgeblich sind jedoch das Verhalten und der Wortlaut der verwendeten Python-Version. Sobald sich die Zeichenkette parsen lässt, kannst du ihren Wert mit repr prüfen, wenn Anzahl oder Position der Backslashes unklar sind.