" EOFError:退出输入"在尝试腌制时不断收到此错误

时间:2014-06-01 18:30:38

标签: python pickle eof

我正在写一个测验程序。我试图给用户提供编写和添加自己的问题的机会。我写过函数来询问和添加问题。我想腌渍 问题列表,以便我可以在任何人添加新问题时自动加载新问题。

这是我用来加载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.感谢您的帮助!

完整代码 http://pastebin.com/HEp0KhRA

1 个答案:

答案 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()