尝试加载和编辑腌制字典,得到 EOFError
Trying to load and edit a pickled dictionary, getting an EOFError
我正在尝试修改在一本书中找到的作为教程一部分的知识问答程序;我需要使用腌制字典保存玩家的姓名和分数。我已经使用单独的程序创建了 dat 文件,以避免从不存在的文件中读取。
这是问答程序的代码。
#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)
当问题结束时,程序尝试 运行 "saving" 模块,该模块(理论上)打开 trivia_scores.dat 文件,加载高分字典,检查是否玩家的名字在字典中,如果他们当前的分数高于文件中的分数,则将其覆盖。
但由于某种原因,当程序尝试加载高分字典时,我却收到此错误消息。
EOFError: Ran out of input
我以前从未见过这个错误。从一些粗略的谷歌搜索中,我得到的印象是它与试图从空文件中读取的程序有关。但这对我来说毫无意义,因为我使用不同的程序专门创建了一个 dat 文件以防止这种情况发生:trivia_scores.dat 不是一个空文件。我什至用 Python Shell 阅读它以确保。
这个错误是什么意思,为什么 Python 不加载 dat 文件?
上下文:我正在阅读的这本书是 Python 绝对初学者,作者是 Michael Dawson。这个程序和我试图完成的挑战来自第 7 章。在我添加保存模块之前,该程序 运行 运行良好。
可能您编写的原始 trivia_scores.dat
文件已损坏(也许您没有调用 close()
?)。您应该尝试创建一个新文件并向该文件添加一个预填充的字典。然后尝试从这个新文件中读取。
我正在尝试修改在一本书中找到的作为教程一部分的知识问答程序;我需要使用腌制字典保存玩家的姓名和分数。我已经使用单独的程序创建了 dat 文件,以避免从不存在的文件中读取。
这是问答程序的代码。
#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)
当问题结束时,程序尝试 运行 "saving" 模块,该模块(理论上)打开 trivia_scores.dat 文件,加载高分字典,检查是否玩家的名字在字典中,如果他们当前的分数高于文件中的分数,则将其覆盖。
但由于某种原因,当程序尝试加载高分字典时,我却收到此错误消息。
EOFError: Ran out of input
我以前从未见过这个错误。从一些粗略的谷歌搜索中,我得到的印象是它与试图从空文件中读取的程序有关。但这对我来说毫无意义,因为我使用不同的程序专门创建了一个 dat 文件以防止这种情况发生:trivia_scores.dat 不是一个空文件。我什至用 Python Shell 阅读它以确保。
这个错误是什么意思,为什么 Python 不加载 dat 文件?
上下文:我正在阅读的这本书是 Python 绝对初学者,作者是 Michael Dawson。这个程序和我试图完成的挑战来自第 7 章。在我添加保存模块之前,该程序 运行 运行良好。
可能您编写的原始 trivia_scores.dat
文件已损坏(也许您没有调用 close()
?)。您应该尝试创建一个新文件并向该文件添加一个预填充的字典。然后尝试从这个新文件中读取。