【问题标题】:Python for absolute beginners chapter 7 challenge 2Python绝对初学者第7章挑战2
【发布时间】:2016-08-10 01:57:15
【问题描述】:

我目前正在为绝对初学者第三次添加 python。我正在努力应对本书第 7 章中的第二个挑战,因为我不断收到一个我不理解的错误。

挑战在于:

“改进 triva 挑战游戏,使其在文件中维护高分列表。如果玩家进入列表,程序应记录玩家的姓名和分数。使用腌制对象存储高分。”

原代码

# 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 trivia 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) 

    return category, question, answers, correct, explanation

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

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

    # get first block
    category, question, answers, correct, explanation = 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's your answer?: ")

        # check answer
        if answer == correct:
            print("\nRight!", end=" ")
            score += 1
        else:
            print("\nWrong.", end=" ")
        print(explanation)
        print("Score:", score, "\n\n")

        # get next block
        category, question, answers, correct, explanation = next_block(trivia_file)

    trivia_file.close()

    print("That was the last question!")
    print("You're final score is", score)

main()  
input("\n\nPress the enter key to exit.")

我对挑战码的尝试

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

import sys, pickle   

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 trivia file."""
    category = next_line(the_file)

    points = 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) 

    return category, points, question, answers, correct, explanation

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

def high_scores():
    global score
    value = int(score)
    name = input("What is your name? ")
    entry = (value, name)
    f = open("high_scores.dat", "wb+")
    high_scores = pickle.load(f)
    high_scores.append(entry)
    high_scores = high_scores[:5]
    print("High Scores\n")
    print("NAME\tSCORE")
    for entry in high_scores:
        value, name = entry
        print(name, "\t", value)
    pickle.dump(high_scores, f)
    f.close()

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

    # get first block
    category, points, question, answers, correct, explanation = 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's your answer?: ")

        # check answer
        if answer == correct:
            print("\nRight!", end=" ")
            j = int(points)
            global score
            score += j
        else:
            print("\nWrong.", end=" ")
        print(explanation)
        print("Score:", score, "\n\n")

        # get next block
        category, points, question, answers, correct, explanation = next_block(trivia_file)

    trivia_file.close()

    print("That was the last question!")
    print("You're final score is", score)
    high_scores()

score = 0

main()  
input("\n\nPress the enter key to exit.")

还有令人困惑的错误

Traceback (most recent call last):
  File "C:\Users\Cheyne\Desktop\Python\chapter07\Challenges\temp.py", line 104, in <module>
    main()
  File "C:\Users\Cheyne\Desktop\Python\chapter07\Challenges\temp.py", line 100, in main
    high_scores()
  File "C:\Users\Cheyne\Desktop\Python\chapter07\Challenges\temp.py", line 54, in high_scores
    high_scores = pickle.load(f)
  File "C:\Python31\lib\pickle.py", line 1365, in load
    encoding=encoding, errors=errors).load()
EOFError

谁能帮忙解释一下这里出了什么问题?我已经盯着它看了好几天了。

【问题讨论】:

  • 请与我们分享代码是如何使用的。你的主要职能是什么?
  • 不要将每个版本的 Python 都放入您的标签中。这些标签旨在对您的问题进行分类。真的是什么版本?使用那个标签。通常,一般的python-3.x 标签就足够了。
  • @ChatterOne 泡菜文件在那里我已经检查并制作了一个新文件并尝试了相同的结果。

标签: python python-3.x python-3.4 python-3.3 python-3.5


【解决方案1】:

您有一个“EOFError”,即第 54 行的“文件结束错误”。

这就是您尝试加载 pickle 文件的地方,因此,考虑到您没有检查该文件是否实际存在,我猜您没有文件并收到错误。

要么自己创建一个初始文件,要么在尝试加载之前检查它是否存在且有效。

编辑:我刚刚注意到您将 pickle 文件打开为“wb+”,这意味着您打开它进行写入并尝试读取它。您正在覆盖文件,该文件变为零字节。如果要附加到现有文件,则应使用“a”而不是“w”。同样,在加载之前确保文件包含有效数据。

【讨论】:

  • 您是否不需要打开文件以进行rb 阅读或rb+ 阅读和可选写入?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多