Python EOF không mong muốn trong khi phân tích cú pháp


82

Đây là mã python của tôi. Ai đó có thể chỉ cho tôi những gì sai với nó.

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

Và đây là những gì sẽ xảy ra:

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

Câu trả lời:


122

Sử dụng raw_inputthay vì input:)

Nếu bạn sử dụng input, thì dữ liệu bạn nhập được hiểu là Biểu thức Python có nghĩa là bạn kết thúc với gawd biết loại đối tượng nào trong biến mục tiêu của bạn và một loạt các ngoại lệ có thể được tạo ra. Vì vậy, bạn KHÔNG nên sử dụng inputtrừ khi bạn đang đưa thứ gì đó vào để thử nghiệm tạm thời, chỉ được sử dụng bởi những người biết một chút về biểu thức Python.

raw_inputluôn trả về một chuỗi vì đó là những gì bạn luôn nhập vào ... nhưng sau đó bạn có thể dễ dàng chuyển đổi nó thành kiểu cụ thể bạn muốn và nắm bắt các ngoại lệ cụ thể có thể xảy ra. Hy vọng rằng với lời giải thích đó, không cần phải bàn cãi để biết bạn nên sử dụng cái nào.

Tài liệu tham khảo

Lưu ý: điều này chỉ dành cho Python 2. Đối với Python 3, raw_input()đã trở nên đơn giản input()và Python 2 input()đã bị xóa.


Nó đã làm việc cho tôi! Nhưng, tôi không chắc là tại sao Linux Mint 18,3 cài đặt của tôi chạy Python 2, mặc dù tôi đã cài đặt Python 3 ...
Bajiru

1
Trong Mint 18.3 (và Ubuntu Xenial dựa trên nó) /usr/bin/pythonlà một tệp thực thi python 2 và /usr/bin/python3là tệp thực thi python 3 của bạn. Với Mint 19, python mặc định của hệ thống là python 3, tôi tin vậy.
simon

16

Thụt lề! Đầu tiên. Điều đó sẽ chăm sóc của bạn SyntaxError.

Ngoài điều đó ra còn có một số vấn đề khác trong chương trình của bạn.

  • Sử dụng raw_inputkhi bạn muốn chấp nhận chuỗi làm đầu vào. inputchỉ nhận các biểu thức Python và nó thực hiện evaltrên chúng.

  • Bạn đang sử dụng các ký tự 8bit nhất định trong tập lệnh của mình như . Bạn có thể cần xác định mã hóa ở đầu tập lệnh của mình bằng cách sử dụng # -*- coding:latin-1 -*-dòng thường được gọi là coding-cookie.

  • Ngoài ra, trong khi thực hiện so sánh str, hãy chuẩn hóa các chuỗi và so sánh. (những người sử dụng thấp hơn () nó) Điều này giúp giảm bớt sự linh hoạt trong việc nhập liệu của người dùng.

  • Tôi cũng nghĩ rằng việc đọc hướng dẫn Python có thể hữu ích cho bạn. :)

Mã mẫu

#-*- coding: latin1 -*-

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

    ....

Được rồi, đó là lỗi Cú pháp. Hãy để tôi chỉnh sửa cho những sai lầm khác bây giờ.
Senthil Kumaran

1
Phần thân của vòng lặp là thụt lề: thụt lề là cách nhóm các câu lệnh của Python. Tại lời nhắc tương tác, bạn phải nhập một tab hoặc (các) khoảng trắng cho mỗi dòng được thụt lề.
Jeremy A. West,

6

Tôi đã gặp lỗi này, do thiếu dấu ngoặc đóng trên một dòng.

Tôi bắt đầu gặp sự cố với một dòng nói: invalid syntax (<string>, line ...)? ở cuối tập lệnh của tôi.

Tôi đã xóa dòng đó, sau đó nhận được thông báo EOF.


4

Mặc dù câu trả lời của @ simon hữu ích nhất trong Python 2, nhưng raw_inputkhông có trong Python 3. Tôi khuyên bạn nên làm như sau để đảm bảo mã của bạn hoạt động tốt như nhau trong Python 2 và Python 3:

Đầu tiên, hãy cài đặt pip trong tương lai:

$ pip install future

Thứ hai: nhập đầu vào từ future.builtins

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

Và đối với ví dụ cụ thể được liệt kê ở trên:

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

4

Tôi đang sử dụng mã sau để có được khả năng tương thích với Python 2 và 3

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

3

Tôi đang cố gắng trả lời chung chung, không liên quan đến câu hỏi này, lỗi này thường xảy ra khi bạn ngắt một nửa cú pháp và quên nửa còn lại. Giống như trong trường hợp của tôi, đó là:

try :
 ....

kể từ khi python đang tìm kiếm một

except Exception as e:
 ....

nhưng nó gặp phải EOF (End Of File), do đó lỗi. Xem liệu bạn có thể tìm thấy bất kỳ cú pháp không đầy đủ nào trong mã của mình không.


1

tôi đã gặp điều tương tự và tôi đã tìm ra vấn đề là gì. Khi chúng ta sử dụng phương thức nhập, phản hồi chúng ta nhập phải ở trong dấu ngoặc kép. Thích trong dòng của bạn date=input("Example: March 21 | What is the date? ")

Bạn nên nhập khi được nhắc trên bảng điều khiển "12/12/2015" - lưu ý "điều trước và sau. Bằng cách này, nó sẽ coi đó là một chuỗi và xử lý nó như mong đợi. Tôi không chắc đây có phải là hạn chế của inputphương pháp này hay không - nhưng nó hoạt động theo cách này.

Hy vọng nó giúp


1

Sau câu lệnh if đầu tiên thay vì gõ "if", hãy nhập "elif" và sau đó nó sẽ hoạt động.

Ví dụ.

`    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

Những gì bạn có thể thử là viết mã của bạn như bình thường cho python bằng inputlệnh bình thường . Tuy nhiên, mẹo là thêm lệnh vào đầu chương trình của bạn input=raw_input.

Bây giờ tất cả những gì bạn phải làm là vô hiệu hóa (hoặc bật) tùy thuộc vào việc bạn đang chạy bằng Python / IDLE hay Terminal. Bạn thực hiện việc này bằng cách chỉ cần thêm '#' khi cần.

Đã tắt để sử dụng trong Python / IDLE

    #input=raw_input 

Và tất nhiên được bật để sử dụng trong thiết bị đầu cuối.

    input=raw_input 

Tôi không chắc liệu nó có luôn hoạt động hay không, nhưng nó là một giải pháp khả thi cho các chương trình hoặc tập lệnh đơn giản.


-2

Kiểm tra xem tất cả các tham số của hàm đã được xác định trước khi chúng được gọi hay chưa. Tôi đã đối mặt với vấn đề này khi luyện tập Kaggle.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.