Python EOF inesperado durante el análisis


82

Aquí está mi código de Python. ¿Podría alguien mostrarme qué tiene de malo?

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

Y esto es lo que sucede:

>>> 
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
>>> 

Respuestas:


122

Usar en raw_inputlugar de input:)

Si lo usa input, entonces los datos que escribe se interpretan como una Expresión de Python, lo que significa que terminará con Dios sabe qué tipo de objeto en su variable de destino y una gran cantidad de excepciones que se pueden generar. Por lo tanto, NO debe usarlo a inputmenos que esté poniendo algo para una prueba temporal, para que lo use solo alguien que sepa un poco sobre las expresiones de Python.

raw_inputsiempre devuelve una cadena porque, diablos, eso es lo que siempre escribe ... pero luego puede convertirlo fácilmente al tipo específico que desea y detectar las excepciones específicas que pueden ocurrir. Con suerte, con esa explicación, es una obviedad saber cuál debe usar.

Referencia

Nota: esto es solo para Python 2. Para Python 3, se raw_input()ha vuelto simple input()y Python 2 input()se ha eliminado.


¡Funcionó para mí! Pero, no estoy seguro de por qué mi instalación de Linux Mint 18.3 ejecuta Python 2, a pesar de que he instalado Python 3 ...
Bajiru

1
En Mint 18.3 (y Ubuntu Xenial en el que se basa) /usr/bin/pythones un ejecutable de Python 2, y /usr/bin/python3es su ejecutable de Python 3. Con Mint 19, creo que el python predeterminado del sistema es python 3.
Simon

16

¡Ponle sangría! primero. Eso se haría cargo de tu SyntaxError.

Aparte de eso, hay un par de otros problemas en su programa.

  • Úselo raw_inputcuando desee aceptar una cadena como entrada. inputsolo toma expresiones de Python y las aplica eval.

  • Estás usando ciertos caracteres de 8 bits en tu script como . Es posible que deba definir la codificación en la parte superior de su secuencia de comandos utilizando la # -*- coding:latin-1 -*-línea comúnmente llamada coding-cookie.

  • Además, mientras realiza la comparación de cadenas, normalice las cadenas y compare. (personas que usan lower () it) Esto ayuda a dar poca flexibilidad con la entrada del usuario.

  • También creo que leer el tutorial de Python puede resultarle útil. :)

Código de muestra

#-*- coding: latin1 -*-

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

    ....

Bien, eso fue por el error de sintaxis. Déjame editar los demás errores ahora.
Senthil Kumaran

1
El cuerpo del bucle tiene sangría: la sangría es la forma en que Python agrupa las declaraciones. En el indicador interactivo, debe escribir una tabulación o espacios para cada línea con sangría.
Jeremy A. West

6

Tuve este error porque faltaba un paréntesis de cierre en una línea.

Empecé a tener un problema con una línea que decía: invalid syntax (<string>, line ...)? al final de mi guión.

Eliminé esa línea y luego recibí el mensaje EOF.


4

Si bien la respuesta de @ simon es más útil en Python 2, raw_inputno está presente en Python 3. Sugeriría hacer lo siguiente para asegurarse de que su código funcione igualmente bien en Python 2 y Python 3:

Primero, pip install future:

$ pip install future

Segundo: importar entrada de future.builtins

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

Y para el ejemplo específico mencionado anteriormente:

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

4

Estoy usando el siguiente código para obtener compatibilidad con Python 2 y 3

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

3

Estoy tratando de responder en general, no relacionado con esta pregunta, este error generalmente ocurre cuando se divide una sintaxis por la mitad y se olvida la otra mitad. Como en mi caso fue:

try :
 ....

ya que Python estaba buscando un

except Exception as e:
 ....

pero encontró un EOF (Fin de archivo), de ahí el error. Vea si puede encontrar alguna sintaxis incompleta en su código.


1

Me encontré con lo mismo y descubrí cuál es el problema. Cuando usamos la entrada del método, la respuesta que debemos escribir debe estar entre comillas dobles. Como en tu linea date=input("Example: March 21 | What is the date? ")

Debería escribir cuando se le solicite en la consola "12/12/2015" - tenga en cuenta el "antes y el después. De esta manera, lo tomará como una cadena y lo procesará como se espera. No estoy seguro de si esto es una limitación de este inputmétodo, pero funciona de esta manera.

Espero eso ayude


1

Después de la primera instrucción if en lugar de escribir "if", escriba "elif" y entonces debería funcionar.

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

Lo que puede intentar es escribir su código normalmente para Python usando el inputcomando normal . Sin embargo, el truco consiste en agregar el comando al principio de la programación input=raw_input.

Ahora todo lo que tiene que hacer es deshabilitar (o habilitar) dependiendo de si está ejecutando en Python / IDLE o Terminal. Puede hacer esto simplemente agregando '#' cuando sea necesario.

Apagado para usar en Python / IDLE

    #input=raw_input 

Y, por supuesto, encendido para su uso en terminal.

    input=raw_input 

No estoy seguro de si siempre funcionará, pero es una posible solución para programas o scripts simples.


-2

Compruebe si todos los parámetros de las funciones están definidos antes de llamarlos. Enfrenté este problema mientras practicaba Kaggle.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.