我正在写一个测验程序。我试图给用户提供编写和添加自己的问题的机会。我写过函数来询问和添加问题。我想腌渍 问题列表,以便我可以在任何人添加新问题时自动加载新问题。
这是我用来加载pickle文件的代码。
sciIn = open('sciList.txt','rb')
sci = pickle.load(sciIn)
sciIn.close()
我在添加问题的函数中有这段代码。
sciOut = open("sciList.txt",'wb')
sci.append(dicQ)
pickle.dump(sci, sciOut)
sciOut.close()
当我运行代码时,我得到了EOFError:输出指向加载pickle的输出。我不确定我做错了什么。我正在使用Python 3.感谢您的帮助!
答案 0 :(得分:1)
我认为你可能正在进行酸洗,但可能在某个时候从空文件开始工作......如果你在加载时这样做,你可能会出现奇怪的EOF
错误。此外,如果您以任何方式手动编辑文件(或者没有使用pickle存储数据),那么加载时也会出现EOF
错误。
这有效(但请注意我将问题存储为字典)。
>>> import pickle
>>> sciIn = open('sciList.txt', 'rb') # has 2 pickled dict entries already
>>> sci = pickle.load(sciIn)
>>> sci
{'what is a dog?': 'a dog', 'what kind of parrot is that?': 'a dead parrot'}
>>> sciIn.close()
>>>
>>> sciOut = open('sciList.txt', 'wb')
>>> sci["what's your favorite colour?"] = "python"
>>> pickle.dump(sci, sciOut)
>>> sciOut.close()
从你的代码中看起来你正在腌制一个列表而不是一个字典(因此附加添加新问题)。以上内容也适用于列表,您只需在代码中添加即可。无论如何,如果你试图从带有pickle的空文件中读取一个对象,你会得到一个EOF
错误 - 但是,如果你从一个通过挑选一个空列表创建的文件中启动你的代码,你不应该得到EOF
错误。
>>> import pickle
>>> sciIn = open('sciList2.txt', 'rb') # has a pickled empty list
>>> sci = pickle.load(sciIn)
>>> sci
['what is a dog?', 'what kind of parrot is that?']
>>> sciIn.close()
>>>
>>> sciOut = open('sciList2.txt', 'wb')
>>> sci.append("what's your favorite color?")
>>> pickle.dump(sci, sciOut)
>>> sciOut.close()