2017-06-20 2 views
0

J'essaye de modifier un programme de trivia trouvé dans un livre dans le cadre d'un tutoriel; J'ai besoin de sauvegarder le nom et le score du joueur en utilisant un dictionnaire mariné. J'ai déjà créé le fichier dat en utilisant un programme séparé, pour éviter de lire à partir d'un fichier qui n'existe pas.Essayer de charger et d'éditer un dictionnaire décapé, obtenir un EOFError

Ceci est le code du programme trivia.

#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.") 

L'erreur du même nom se produit à ce stade:

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

Lorsque la fin des questions, le programme tente d'exécuter le module « d'économie », qui (en théorie) ouvre le fichier trivia_scores.dat, charge le dictionnaire highscores, vérifie si le nom du joueur est dans le dictionnaire et si le score actuel est supérieur à celui du fichier, il l'écrase.

Mais pour une raison quelconque, lorsque le programme tente de charger le dictionnaire des meilleurs scores, à la place, je reçois ce message d'erreur.

EOFError: Ran out of input 

Je n'ai jamais vu cette erreur auparavant. À partir de quelques recherches superficielles, j'ai eu l'impression que cela avait quelque chose à voir avec le programme essayant de lire à partir d'un fichier vide. Mais cela n'a pas de sens pour moi, puisque j'ai spécifiquement créé un fichier dat en utilisant un programme différent pour empêcher cela: trivia_scores.dat n'est PAS un fichier vide. Je l'ai même lu avec Python Shell pour être sûr.

Qu'est-ce que cette erreur signifie, et pourquoi Python ne chargera-t-il pas le fichier dat?

Contexte: Le livre que je lis est Python pour le débutant absolu, par Michael Dawson. Ce programme et le défi que j'essaie de relever viennent du chapitre 7. Le programme fonctionnait bien avant d'ajouter le module de sauvegarde.

+0

peut-être travailler à partir d'un fichier vide à un moment donné –

Répondre

0

Probablement le fichier original trivia_scores.dat que vous avez écrit est corrompu (peut-être que vous n'avez pas appelé close() dessus?). Vous devriez essayer de créer un nouveau fichier et d'ajouter un dictionnaire pré-rempli à ce fichier. Ensuite, essayez de lire à partir de ce nouveau fichier.

+0

Cela a résolu mon problème initial, mais en corrigeant l'erreur, je suis confronté à un problème différent. Merci quand même. –

+0

@TimtheEnchanter L'erreur ne se produisait-elle pas avant? Peut-être était-il "caché" parce que le 'EOFError' s'était produit avant lui. –

+0

Non, l'erreur était la raison pour laquelle j'ai posté ceci. J'ai eu l'erreur d'arrêter d'apparaître en faisant un nouveau fichier dat, mais maintenant je suis confronté à un problème de logique de programme. J'ai besoin du programme pour ouvrir et ajouter un fichier dat, mais si j'utilise la fonction "ab +", il me redonne l'erreur, et je ne peux pas utiliser la fonction "wb +" car elle écrase les autres pas les initiales que j'ai définies en utilisant l'autre programme, pour une raison quelconque). –