python - "EOFError: Ran out of input"尝试 pickle 时不断出现此错误

标签 python pickle eof

我正在编写一个测验程序。我试图让用户有机会编写和添加他们自己的问题。我已经编写了询问和添加问题的函数。我想 pickle 问题列表,这样我就可以在有人添加问题时自动加载新问题。

这是我用来加载 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: Ran out of input,它指向 pickle 的加载。我不确定我做错了什么。我正在使用 Python 3。感谢您的帮助!

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

最佳答案

我认为您可能正在正确地进行 pickle ,但也许在某个时候从一个空文件开始工作……如果您在加载时这样做,您可能会遇到奇怪的 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 错误——但是,如果您从一个通过 pickle 创建的文件开始您的代码空列表,你不应该得到一个 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()

关于python - "EOFError: Ran out of input"尝试 pickle 时不断出现此错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983082/

相关文章:

python - 是否有实例方法

python - 使用 Fabric 时连接到 ~/.ssh/config 中列出的主机

python pickle.dumps 断言错误

python - AttributeError : dlsym(0x7fc4cfd563b0, add_all_items_to_map): symbol not found;使用 C 从 Python 运行 Go

python - 拆分字符串而不删除 python 中的定界符

python - 如何使用自引用和带有插槽的类来 pickle 和取消 pickle 对象?

pickle - 保存 Theano 模型不适用于 MLP 网络

bash - 如何找到Logstash在EOF?

c - 尝试计算 C 中的单词时 EOF 没有终止

c - Linux 中的 read 调用是否会在 EOF 处添加换行符?