Python unerwartete EOF beim Parsen


81

Hier ist mein Python-Code. Könnte mir jemand zeigen, was daran falsch ist.

while 1:
date=input("Example: March 21 | What is the date? ")
if date=="June 21":
    sd="23.5° North Latitude"
if date=="March 21" | date=="September 21":
    sd="0° Latitude"
if date=="December 21":
    sd="23.5° South Latitude"
if sd:
    print sd

Und hier ist was passiert:

>>> 
Example: March 21 | What is the date? 
Traceback (most recent call last):
  File "C:\Users\Daniel\Desktop\Solar Declination Calculater.py", line 2, in <module>
    date=input("Example: March 21 | What is the date? ")
  File "<string>", line 0

   ^
SyntaxError: unexpected EOF while parsing
>>> 

Antworten:


121

Verwenden Sie raw_inputanstelle von input:)

Wenn Sie verwenden input, werden die von Ihnen eingegebenen Daten als Python-Ausdruck interpretiert. Dies bedeutet, dass Sie am Ende wissen, welcher Objekttyp in Ihrer Zielvariablen enthalten ist, und eine Vielzahl von Ausnahmen, die generiert werden können. Sie sollten es also NICHT verwenden, es inputsei denn, Sie geben etwas für temporäre Tests ein, um es nur von jemandem zu verwenden, der etwas über Python-Ausdrücke weiß.

raw_inputGibt immer eine Zeichenfolge zurück, weil Sie das immer eingeben ... aber dann können Sie es einfach in den gewünschten Typ konvertieren und die möglicherweise auftretenden Ausnahmen abfangen. Mit dieser Erklärung ist es hoffentlich ein Kinderspiel zu wissen, welche Sie verwenden sollten.

Referenz

Hinweis: Dies gilt nur für Python 2. Für Python 3 raw_input()wurde es einfach input()und Python 2 input()wurde entfernt.


Es hat bei mir funktioniert! Ich bin mir jedoch nicht sicher, warum auf meiner Linux Mint 18.3-Installation Python 2 ausgeführt wird, obwohl ich Python 3 installiert habe ...
Bajiru

1
In Mint 18.3 (und Ubuntu Xenial, auf dem es basiert) /usr/bin/pythonist eine ausführbare Python 2-Datei und /usr/bin/python3Ihre ausführbare Python 3-Datei. Mit Mint 19 ist die Standardpython des Systems Python 3, glaube ich.
Simon

16

Einrücken! zuerst. Das würde sich um deine kümmern SyntaxError.

Abgesehen davon gibt es einige andere Probleme in Ihrem Programm.

  • Verwenden raw_inputSie diese Option, wenn Sie eine Zeichenfolge als Eingabe akzeptieren möchten. inputNimmt nur Python-Ausdrücke und es macht eine evalauf sie.

  • Sie verwenden bestimmte 8-Bit-Zeichen in Ihrem Skript wie . Möglicherweise müssen Sie die Codierung oben in Ihrem Skript mithilfe einer # -*- coding:latin-1 -*-Zeile definieren, die üblicherweise als Codierungs-Cookie bezeichnet wird.

  • Normalisieren Sie beim Str-Vergleich auch die Strings und vergleichen Sie sie. (Personen, die lower () it verwenden) Dies trägt dazu bei, dass Benutzereingaben wenig Flexibilität bieten.

  • Ich denke auch, dass das Lesen des Python-Tutorials für Sie hilfreich sein könnte. :) :)

Beispielcode

#-*- coding: latin1 -*-

while 1:
    date=raw_input("Example: March 21 | What is the date? ")
    if date.lower() == "march 21":

    ....

Okay, das war für den Syntaxfehler. Lassen Sie mich jetzt für die anderen Fehler bearbeiten.
Senthil Kumaran

1
Der Hauptteil der Schleife wird eingerückt: Einrückung ist Pythons Art, Anweisungen zu gruppieren. An der interaktiven Eingabeaufforderung müssen Sie für jede eingerückte Zeile eine Registerkarte oder Leerzeichen eingeben.
Jeremy A. West

6

Ich hatte diesen Fehler aufgrund einer fehlenden schließenden Klammer in einer Zeile.

Ich hatte ein Problem mit der Zeile: invalid syntax (<string>, line ...)? Am Ende meines Skripts.

Ich habe diese Zeile gelöscht und dann die EOF-Nachricht erhalten.


4

Während die Antwort von @ simon in Python 2 am hilfreichsten raw_inputist , ist sie in Python 3 nicht vorhanden. Ich würde Folgendes vorschlagen, um sicherzustellen, dass Ihr Code in Python 2 und Python 3 gleich gut funktioniert:

Erstens, Pip installieren Zukunft:

$ pip install future

Zweitens: Importieren Sie Eingaben aus future.builtins

# my_file.py    
from future.builtins import input
str_value = input('Type something in: ')

Und für das oben aufgeführte spezifische Beispiel:

# example.py
from future.builtins import input
my_date = input("Example: March 21 | What is the date? ")

4

Ich verwende den folgenden Code, um die Kompatibilität mit Python 2 und 3 zu erhalten

if sys.version_info < (3, 0):
    input = raw_input

3

Ich versuche im Allgemeinen zu antworten, nicht im Zusammenhang mit dieser Frage. Dieser Fehler tritt im Allgemeinen auf, wenn Sie eine Syntax in zwei Hälften teilen und die andere Hälfte vergessen. Wie in meinem Fall war es:

try :
 ....

da suchte Python nach einem

except Exception as e:
 ....

Es wurde jedoch ein EOF (End Of File) festgestellt, daher der Fehler. Überprüfen Sie, ob Ihr Code eine unvollständige Syntax enthält.


1

Ich bin auf das Gleiche gestoßen und habe herausgefunden, worum es geht. Wenn wir die Methodeneingabe verwenden, sollte die Antwort, die wir eingeben sollten, in doppelte Anführungszeichen stehen. Wie in deiner Linie date=input("Example: March 21 | What is the date? ")

Sie sollten eingeben, wenn Sie auf der Konsole "12/12/2015" dazu aufgefordert werden - beachten Sie die "Sache vorher und nachher. Auf diese Weise wird dies als Zeichenfolge verwendet und wie erwartet verarbeitet. Ich bin nicht sicher, ob dies eine Einschränkung dieser inputMethode ist - aber es funktioniert so.

Ich hoffe es hilft


1

Nach der ersten if-Anweisung anstatt "if" einzugeben, geben Sie "elif" ein und dann sollte es funktionieren.

Ex.

`    while 1:
    date=input("Example: March 21 | What is the date? ")
if date=="June 21":
    sd="23.5° North Latitude
elif date=="March 21" | date=="September 21":
    sd="0° Latitude"
elif date=="December 21":
    sd="23.5° South Latitude"
elif sd:
    print sd `

0

Sie können versuchen, Ihren Code wie gewohnt für Python mit dem normalen inputBefehl zu schreiben . Der Trick besteht jedoch darin, zu Beginn des Programmierens den Befehl hinzuzufügen input=raw_input.

Jetzt müssen Sie nur noch deaktivieren (oder aktivieren), je nachdem, ob Sie in Python / IDLE oder Terminal arbeiten. Sie tun dies, indem Sie bei Bedarf einfach '#' hinzufügen.

Zur Verwendung in Python / IDLE ausgeschaltet

    #input=raw_input 

Und natürlich für den Einsatz im Terminal eingeschaltet.

    input=raw_input 

Ich bin nicht sicher, ob es immer funktionieren wird, aber es ist eine mögliche Lösung für einfache Programme oder Skripte.


-2

Überprüfen Sie, ob alle Parameter von Funktionen definiert sind , bevor Sie sie aufrufen. Ich hatte dieses Problem beim Üben von Kaggle.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.