Why does standard input() cause an EOF error [duplicate]
Asked Answered
C

2

6

I was solving a problem on HackerRank when I encountered the following problem in my code. I tested it out on my Python (2.7.10) IDLE , and it was working fine. But it showed the following error on HackerRank:

Traceback (most recent call last):
  File "solution.py", line 13, in <module>
    input_2=input()
EOFError: EOF when reading a line

I entered the following code:

import sys 
input_2=""
n=int(input())
m=0
l=0
array=[]
main_array=[]
for i in range (0,n):
    inp=input()
    array=(inp.split(" "))
    main_array+=array   
for no in range(0,100000,1):    
    input_2=input()
    for m in range(0,len(main_array),2):
        l=0
        if input_2==main_array[m]:
            l+=1
            print (main_array[m]+"="+main_array[m+1])
    if l==0:
        print ("Not found")

I don't know why this error turned up in the HackerRank Engine. Thanks

Calefactory answered 27/11, 2016 at 12:1 Comment(6)
On online platforms there's usually a text box in which you place input, it isn't done as it is in your terminal.Dripps
It means you tried reading more lines of input than were provided. Give us a description of the input, or just a link to the problem.Cronin
hackerrank.com/challenges/…Calefactory
Which version of python are you using? You tested using 2.7, but you should use raw_input() on 2.7.Finnish
i tried using raw_input on hackerrank but it didn't workCalefactory
@YajurTayal read this.. https://mcmap.net/q/1915261/-why-do-i-get-this-eoferror-calling-raw_inputDelainedelainey
C
0

I don't know what are you exactly trying to achieve through your code, but you are getting an error due to the line inp=input(), which tries to take a string as input, whereas it's designed to take an int, float, or string entered with quotes in python 2.7. Use raw_input() instead to take the complete line as string input, and then split it with space as delimiter.

I followed the link you provided, and I see that the given question needs to be solved using dictionaries. Hence, instead of appending the name and number, just store it in dictionary as a key-value pair and for each query, just check whether the key exists in the dictionary or not. If not, print Not found, else print the key and its corresponding value. Here is the code for reference :

import sys
input_2=""
n = input()
m=0
l=0
array=[]
main_array={}
for i in range (0,n):
    inp=raw_input()
    array=(inp.split())
    main_array[array[0]] = array[1]
for i in range(0,n):
    take = raw_input()
    if take in main_array :
        print take+"="+main_array[take]
    else :
        print "Not found"

Hope this helps !

Concordia answered 27/11, 2016 at 13:18 Comment(0)
F
3

I encountered similar EOF issues when I coded in HackerRank. Actually, there are 2 issues:

  1. use input() in Python3 and raw_input() in Python2.
  2. If you know the exact number of input, you can N-number for-loop to handle each input(). However, the difficulty is that you don't know how many inputs you will have. In this case, you will have to use sys.stdin.readlines() to convert them into a list, and then use a for-each loop.

The following codes are from "Editorial" of https://www.hackerrank.com/challenges/30-dictionaries-and-maps/

import sys 

# Read input and assemble Phone Book
n = int(input())
phoneBook = {}
for i in range(n):
    contact = input().split(' ')
    phoneBook[contact[0]] = contact[1]

# Process Queries
lines = sys.stdin.readlines()  # convert lines to list
for i in lines:
    name = i.strip()
    if name in phoneBook:
        print(name + '=' + str( phoneBook[name] ))
    else:
        print('Not found')
Folio answered 1/8, 2017 at 19:20 Comment(1)
Thanks for posting this - this is the best answer. (They're still using this problem at HackerRank)Astronaut
C
0

I don't know what are you exactly trying to achieve through your code, but you are getting an error due to the line inp=input(), which tries to take a string as input, whereas it's designed to take an int, float, or string entered with quotes in python 2.7. Use raw_input() instead to take the complete line as string input, and then split it with space as delimiter.

I followed the link you provided, and I see that the given question needs to be solved using dictionaries. Hence, instead of appending the name and number, just store it in dictionary as a key-value pair and for each query, just check whether the key exists in the dictionary or not. If not, print Not found, else print the key and its corresponding value. Here is the code for reference :

import sys
input_2=""
n = input()
m=0
l=0
array=[]
main_array={}
for i in range (0,n):
    inp=raw_input()
    array=(inp.split())
    main_array[array[0]] = array[1]
for i in range(0,n):
    take = raw_input()
    if take in main_array :
        print take+"="+main_array[take]
    else :
        print "Not found"

Hope this helps !

Concordia answered 27/11, 2016 at 13:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.