Python несподівано EOF під час аналізу


82

Ось мій код python. Хтось може показати мені, що з цим не так.

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

І ось що відбувається:

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

Відповіді:


122

Використовуйте raw_inputзамість input:)

Якщо ви використовуєте input, то дані, які ви вводите, інтерпретуються як вираз Python, що означає, що в кінцевому підсумку ви отримаєте gawd, який тип об'єкта у вашій цільовій змінній, і широкий спектр винятків, які можна створити. Тому вам НЕ слід користуватися, inputякщо ви не вкладаєте щось для тимчасового тестування, щоб використовувати його лише той, хто трохи знає вирази Python.

raw_inputзавжди повертає рядок, бо, чорт візьми, це те, що ви завжди вводите ... але тоді ви можете легко перетворити його на певний тип, який ви хочете, і вловити конкретні винятки, які можуть виникнути. Сподіваємось, з цим поясненням неважко знати, що слід використовувати.

Довідково

Примітка: це стосується лише Python 2. Для Python 3 raw_input()він став простим, input()а Python 2 input()видалений.


У мене це вийшло! Але я не впевнений, чому на моїй установці Linux Mint 18.3 працює Python 2, хоча я встановив Python 3 ...
Bajiru

1
У Mint 18.3 (і Ubuntu Xenial, на якій він базується) /usr/bin/pythonє виконуваним файлом python 2 і /usr/bin/python3є вашим виконуваним файлом python 3. У Mint 19, я вважаю, системним python за замовчуванням є python 3.
simon

16

Відступи! спочатку. Це подбало б про ваше SyntaxError.

Окрім цього, у вашій програмі є ще кілька проблем.

  • Використовуйте, raw_inputколи хочете прийняти рядок як вхід. inputприймає лише вирази Python і робить evalна них.

  • Ви використовуєте певні 8-бітові символи у своєму сценарії, як . Можливо, вам доведеться визначити кодування у верхній частині вашого сценарію, використовуючи # -*- coding:latin-1 -*-рядок, який зазвичай називають cookie-кодом.

  • Крім того, виконуючи порівняння str, нормалізуйте рядки та порівняйте. (люди, які використовують нижчий () it) Це допомагає забезпечити невелику гнучкість при введенні користувачем даних.

  • Я також думаю, що читання підручника з Python може вам допомогти. :)

Зразок коду

#-*- coding: latin1 -*-

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

    ....

Гаразд, це стосувалось помилки синтаксису. Дозвольте мені відредагувати інші помилки зараз.
Senthil Kumaran

1
Тіло циклу має відступ: відступ - це спосіб групування операторів Python. У інтерактивному підказці вам потрібно ввести вкладку або пробіл (и) для кожного рядка з відступом.
Джеремі А. Вест,

6

У мене сталася ця помилка через відсутність закриваючих дужок у рядку.

У мене почалася проблема з рядком, який сказав: invalid syntax (<string>, line ...)? в кінці мого сценарію.

Я видалив цей рядок, а потім отримав повідомлення EOF.


4

Хоча відповідь @ simon є найбільш корисною в Python 2, raw_inputїї немає в Python 3. Я пропоную зробити наступне, щоб переконатися, що ваш код працює однаково добре в Python 2 і Python 3:

Спочатку встановіть pip майбутнє:

$ pip install future

По-друге: імпорт вхідних даних з future.builtins

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

А для конкретного прикладу, перерахованого вище:

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

4

Я використовую наступний код, щоб отримати сумісність Python 2 і 3

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

3

Я намагаюся відповісти загалом, не пов'язано з цим питанням, ця помилка зазвичай виникає, коли ви розбиваєте синтаксис навпіл і забуваєте другу половину. Як у моєму випадку це було:

try :
 ....

оскільки python шукав

except Exception as e:
 ....

але він зіткнувся з EOF (End Of File), звідси і помилка. Подивіться, чи можете ви знайти неповний синтаксис у своєму коді.


1

я натрапив на те саме, і зрозумів, у чому проблема. Коли ми використовуємо метод введення, відповідь, яку ми повинні ввести, має бути в подвійних лапках. Як у вашій лінії date=input("Example: March 21 | What is the date? ")

Ви повинні набирати текст, коли вам буде запропоновано на консолі "12.12.2015" - зверніть увагу на інформацію "до і після. Таким чином він сприйме це як рядок і обробить, як очікувалося. Я не впевнений, що це обмеження цьогоinput методу - але він працює таким чином.

Сподіваюся, це допоможе


1

Після першого оператора if замість набору "if" введіть "elif", і тоді він повинен працювати.

Напр.

`    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

Ви можете спробувати написати свій код як звичайний для python, використовуючи звичайну inputкоманду. Однак фокус полягає у додаванні на початку програмування командиinput=raw_input .

Тепер все, що вам потрібно зробити, це вимкнути (або увімкнути) залежно від того, запущено ви в Python / IDLE або Terminal. Ви робите це, просто додаючи "#", коли це потрібно.

Вимкнено для використання в Python / IDLE

    #input=raw_input 

І звичайно включений для використання в терміналі.

    input=raw_input 

Я не впевнений, що це завжди буде працювати, але це можливе рішення для простих програм або сценаріїв.


0

Перевірте версію вашого компілятора.

  1. якщо ви маєте справу з Python2, тоді використовуйте -

n= raw_input("Enter your Input: ")

  1. якщо ви маєте справу з використанням python3 -

n= input("Enter your Input: ")


-2

Перевірте, чи всі параметри функцій визначені, перш ніж їх викликати. Я стикався з цією проблемою, практикуючи Каггл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.