2017-06-20 59 views
0

我试图修改作为教程的一部分在书中找到的琐事程序;我需要使用腌字典保存玩家的名字和得分。我已经使用单独的程序创建了dat文件,以避免读取不存在的文件。试图加载和编辑腌字典,得到一个EOFError

这是琐事程序的代码。

#Trivia Challenge 
#Trivia game that reads a plain text file 

import sys 

def open_file(file_name, mode): 
    """Open a file""" 
    try: 
     the_file = open(file_name, mode) 
    except IOError as e: 
     print("Unable to open the file", file_name, "Ending program.\n", e) 
     input("\n\nPress the enter key to exit.") 
     sys.exit() 
    else: 
     return the_file 

def next_line(the_file): 
    """Return next line from the trivia file, formatted.""" 
    line = the_file.readline() 
    line = line.replace("/", "\n") 
    return line 

def next_block(the_file): 
    """Return the next block of data from the triva file.""" 
    category = next_line(the_file) 

    question = next_line(the_file) 

    answers = [] 
    for i in range(4): 
     answers.append(next_line(the_file)) 

    correct = next_line(the_file) 
    if correct: 
     correct = correct[0] 

    explanation = next_line(the_file) 

    value = next_line(the_file) 

    return category, question, answers, correct, explanation, value 

def welcome(title): 
    """Welcome the player and get his or her name.""" 
    print("\t\tWelcome to Trivia Challenge!\n") 
    print("\t\t", title, "\n") 

def saving(player_name): 
    import pickle 
    f = open("trivia_scores.dat", "rb+") 
    highscores = pickle.load(f) 
    if player_name in highscores and score > highscores[player_name]: 
     highscores[player_name] = score 
     pickle.dump(highscores, f) 
    elif player_name not in highscores: 
     highscores[player_name] = score 
     pickle.dump(highscores, f) 

    print("The current high scores are as follows:") 
    print(highscores) 
    f.close() 

def main(): 
    trivia_file = open_file("trivia.txt", "r") 
    title = next_line(trivia_file) 
    welcome(title) 
    score = 0 

#Get the first block 
    category, question, answers, correct, explanation, value = next_block(trivia_file) 
    while category: 
     #Ask a question 
     print(category) 
     print(question) 
     for i in range(4): 
      print("\t", i + 1, "-", answers[i]) 

     #Get answer 
     answer = input("What is your answer?: ") 

     #Check answer 
     if answer == correct: 
      print("\nRight!", end=" ") 
      score += int(value) 
     else: 
      print("\nWrong!", end=" ") 
     print(explanation) 
     print("Score:", score, "\n\n") 

     #Get the next block 
     category, question, answers, correct, explanation, value = next_block(trivia_file) 

    trivia_file.close() 

    print("That was the last question!") 
    print("Your final score is", score) 
    return score 

player_name = input("First, enter your name: ") 
main() 
saving(player_name) 
input("\n\nPress the enter key to exit.") 

同名错误发生在这一点上:

def saving(player_name): 
    import pickle 
    f = open("trivia_scores.dat", "rb+") 
    highscores = pickle.load(f) 

当问题结束,该程序试图运行“节能”模块,该模块(理论上)打开trivia_scores.dat文件,加载高分榜字典,检查玩家的名字是否在字典中,以及如果他们的当前分数高于文件中的分数,它将覆盖它。

但由于某种原因,当程序尝试加载高分词典时,我得到此错误消息。

EOFError: Ran out of input 

我从来没有见过这个错误。从一些粗略的谷歌搜索中,我得到了这样的印象:它与试图从空文件读取的程序有关。但是这对我来说没有意义,因为我使用不同的程序专门创建了一个dat文件以防止发生:trivia_scores.dat不是空文件。我甚至用Python Shell来读取它以确保。

这个错误是什么意思,为什么Python不加载dat文件?

上下文:我正在阅读的书是由Michael Dawson撰写的绝对初学者的Python。这个程序和我试图完成的挑战来自第7章。在添加保存模块之前,程序运行良好。

+0

可能在某个点从空文件工作 –

回答

0

您写的文件可能原来的trivia_scores.dat已损坏(也许你没有打电话给close()?)。您应该尝试创建一个新文件并向该文件添加一个预填充的字典。然后尝试从这个新文件读取。

+0

这解决了我最初的问题,但修复错误后,我正在处理一个不同的问题。不管怎么说,还是要谢谢你。 –

+0

@TimtheEnchanter之前没有发生错误吗?可能是因为之前发生过'EOFError'而被“隐藏”了。 –

+0

不,错误是我发布这个的原因。我得到了一个新的dat文件来停止显示的错误,但现在我正在处理程序逻辑问题。 我需要程序来打开和追加一个dat文件,但是如果我使用“ab +”函数,它会再次给我错误,我不能使用“wb +”函数,因为它会覆盖其他分数(但不是我使用其他程序设置的最初版本,出于某种原因)。 –