【问题标题】:UnpicklingError: Invalid load key'(heart)'UnpicklingError:无效的加载键'(心脏)'
【发布时间】:2014-05-31 05:45:15
【问题描述】:

几天来,我一直在玩弄泡菜,试图将它应用到“猜数字”练习程序的高分系统中。我以为我已经正确掌握了这个概念,但是现在出现了这个错误,我不知道为什么。

以下是相关代码:

def EnterHighScore(score,scoresList):
    name = input("Enter your name: ")
    newPlayer = player(name,score)
    scoresList.append(newPlayer)
    scoresFile = open('scores','wb')
    pickle.dump(scoresList,scoresFile)
    scoresFile.close()

    for i in scoresList:
        print(i.name + ' - ' + str(i.score))

def CheckHighScores(score):
    try:
        scoresFile = open('scores','rb')
    except:
        scoresFile = open('scores','wb+')

    if not scoresFile.read(1):
        scoresList = []
    else:
        scoresList = pickle.load(scoresFile)
    scoresFile.close()

    if not scoresList:
        EnterHighScore(score,scoresList)
    else:
        for counter,i in enumerate(scoresList):
            if counter == 3:
                break
            if score >= i.score:
                EnterHighScore(score,scoresList)
                break

当我运行它时,第一次运行正常。也就是说,当“分数”文件甚至不存在时。它被正确创建,scoresList 被创建为空,然后用一个播放器对象填充,它被转储到 scoreFile 中而没有任何错误。但是当我尝试使用新的“分数”文件数据加载 scoreList 时,它给了我以下错误:

UnpicklingError: Invalid load key'(heart)'

(heart) 代表一个实际的心脏字符。

我读到其他人也遇到过这个问题,但在那些情况下,他们试图在不同的操作系统中打开文件,或者在酸洗之后但在解酸之前以某种方式修改了文件。在这种情况下,文件根本没有被修改,只是写入并关闭。

我曾尝试在其他更简单的场景中使用 pickle,但没有导致其他错误。

任何帮助将不胜感激。

【问题讨论】:

    标签: python file-io pickle


    【解决方案1】:

    查看文件是否为空的测试将文件读取指针推进到文件开头:

    if not scoresFile.read(1):
    

    你必须回到起点:

    if not scoresFile.read(1):
        scoresList = []
    else:
        scoresFile.seek(0)
        scoresList = pickle.load(scoresFile)
    

    如果文件为空,您将捕获pickle.load() 抛出的EOFError 异常,这是一个更好的测试:

    try:
        scoresList = pickle.load(scoresFile)
    except EOFError:
        # File empty
        scoresList = []
    

    或者您可以在文件不存在时捕获IOError

    try:
        with open('scores','rb') as scoresFile:
            scoresList = pickle.load(scoresFile)
    except IOError:
        scoresList = []
    

    只是不要在此处打开要写入的文件。

    【讨论】:

    • 非常感谢!我对文件 I/O 比较陌生,而且我一直很难记住读取指针的位置。实际上记得它的存在!如果您不介意,我想在我的博客中发布您的答案。
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多