Python nieoczekiwany EOF podczas analizowania


82

Oto mój kod w Pythonie. Czy ktoś mógłby mi pokazać, co w tym złego.

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

A oto co się dzieje:

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

Odpowiedzi:


122

Użyj raw_inputzamiast input:)

Jeśli używasz input, dane, które wpisujesz, są interpretowane jako wyrażenie Pythona, co oznacza, że ​​skończysz z gawd, który wie, jaki typ obiektu w zmiennej docelowej, i do cholery z szerokiego zakresu wyjątków, które można wygenerować. Więc NIE powinieneś używaćinput chyba że umieszczasz coś do tymczasowego testowania, do użytku tylko przez kogoś, kto trochę wie o wyrażeniach Pythona.

raw_inputzawsze zwraca ciąg, ponieważ, do diabła, to jest to, co zawsze wpisujesz ... ale wtedy możesz łatwo przekonwertować go na określony typ, który chcesz, i złapać określone wyjątki, które mogą wystąpić. Miejmy nadzieję, że z tym wyjaśnieniem nie trzeba się zastanawiać, którego należy użyć.

Odniesienie

Uwaga: dotyczy to tylko języka Python 2. W przypadku języka Python 3 raw_input()stało się zwykłe, input()a Python 2 input()został usunięty.


U mnie zadziałało! Ale nie jestem pewien, dlaczego moja instalacja Linux Mint 18.3 uruchamia Python 2, mimo że zainstalowałem Python 3 ...
Bajiru

1
W Mint 18.3 (i Ubuntu Xenial, na którym jest oparty) /usr/bin/pythonjest plikiem wykonywalnym Pythona 2 i /usr/bin/python3jest to plik wykonywalny Pythona 3. Wydaje mi się, że w Mint 19 domyślnym Pythonem w systemie jest python 3.
simon

16

Wcnij to! pierwszy. To by zadbało o twoje SyntaxError.

Poza tym w twoim programie jest kilka innych problemów.

  • Użyj, raw_inputgdy chcesz zaakceptować ciąg jako dane wejściowe. inputprzyjmuje tylko wyrażenia Pythona i robi evalna nich.

  • Używasz w swoim skrypcie pewnych 8-bitowych znaków, takich jak . Może być konieczne zdefiniowanie kodowania u góry skryptu za pomocą # -*- coding:latin-1 -*-wiersza powszechnie nazywanego kodowaniem-cookie.

  • Ponadto, podczas porównywania str, znormalizuj ciągi i porównaj. (osoby używające lower () it) Pomaga to w zapewnieniu niewielkiej elastyczności przy wprowadzaniu danych przez użytkownika.

  • Myślę też, że przeczytanie samouczka Pythona może ci pomóc. :)

Przykładowy kod

#-*- coding: latin1 -*-

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

    ....

OK, to było z powodu błędu składni. Pozwól, że poprawię teraz inne błędy.
Senthil Kumaran

1
Ciało pętli jest wcięte: wcięcie to sposób grupowania instrukcji w Pythonie. Po wyświetleniu monitu interaktywnego musisz wpisać tabulator lub spacje dla każdego wciętego wiersza.
Jeremy A. West

6

Wystąpił ten błąd z powodu braku nawiasu zamykającego w wierszu.

Zacząłem mieć problem z linijką mówiącą: invalid syntax (<string>, line ...)? na końcu mojego scenariusza.

Usunąłem tę linię, a następnie otrzymałem wiadomość EOF.


4

Chociaż odpowiedź @ simona jest najbardziej pomocna w Pythonie 2, raw_inputnie występuje w Pythonie 3. Proponuję wykonać następujące czynności, aby upewnić się, że kod działa równie dobrze w Pythonie 2 i Pythonie 3:

Najpierw pip install future:

$ pip install future

Po drugie: import danych wejściowych z future.builtins

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

A dla konkretnego przykładu wymienionego powyżej:

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

4

Używam poniższego kodu, aby uzyskać zgodność z Python 2 i 3

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

3

Próbuję odpowiedzieć ogólnie, niezwiązane z tym pytaniem, ten błąd generalnie pojawia się, gdy złamiesz składnię na pół i zapomnisz o drugiej połowie. Tak jak w moim przypadku było to:

try :
 ....

ponieważ Python szukał pliku

except Exception as e:
 ....

ale napotkał EOF (End Of File), stąd błąd. Sprawdź, czy możesz znaleźć niekompletną składnię w swoim kodzie.


1

Natknąłem się na to samo i zorientowałem się, o co chodzi. Kiedy używamy metody input, odpowiedź, którą powinniśmy wpisać, powinna być w podwójnych cudzysłowach. Jak w twojej linii date=input("Example: March 21 | What is the date? ")

Po wyświetleniu monitu na konsoli należy wpisać „12/12/2015” - zanotuj to "przed i po. W ten sposób weźmie to jako ciąg i przetworzy zgodnie z oczekiwaniami. Nie jestem pewien, czy to jest ograniczenie tej inputmetody - ale tak działa.

Mam nadzieję, że to pomoże


1

Po pierwszej instrukcji if zamiast wpisywać „if” wpisz „elif” i powinno działać.

Dawny.

`    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

Możesz spróbować normalnie napisać kod dla Pythona przy użyciu zwykłego inputpolecenia. Jednak sztuczka polega na dodaniu na początku programu polecenia input=raw_input.

Teraz wszystko, co musisz zrobić, to wyłączyć (lub włączyć) w zależności od tego, czy pracujesz w Pythonie / IDLE czy Terminalu. Robisz to, po prostu dodając „#” w razie potrzeby.

Wyłączony do użytku w Pythonie / IDLE

    #input=raw_input 

I oczywiście włączony do użytku w terminalu.

    input=raw_input 

Nie jestem pewien, czy zawsze będzie działać, ale jest to możliwe rozwiązanie dla prostych programów lub skryptów.


0

Sprawdź wersję swojego kompilatora.

  1. jeśli masz do czynienia z Pythonem2, użyj -

n= raw_input("Enter your Input: ")

  1. jeśli masz do czynienia z pythonem3 użyj -

n= input("Enter your Input: ")


-2

Sprawdź, czy wszystkie parametry funkcji są zdefiniowane przed ich wywołaniem. Zmierzyłem się z tym problemem podczas ćwiczeń Kaggle.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.