5

我有以下代码片段:

def database(self):
    databasename=""
    host=""
    user=""
    password=""
    try:
        self.fp=file("detailing.dat","rb")
    except IOError:
        self.fp=file("detailing.dat","wb")
        pickle.dump([databasename,host,user,password],self.fp,-1)
        self.fp.close()
        selffp=file("detailing.dat","rb")
        [databasename,host,user,password]=pickle.load(self.fp)

    return

它有错误:

Traceback (most recent call last):
  File "detailing.py", line 91, in ?
    app=myApp()
  File "detailing.py", line 20, in __init__
    wx.App.__init__(self,redirect,filename,useBestVisual,clearSigInt)
  File "/usr/lib64/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7473, in __init__
    self._BootstrapApp()
  File "/usr/lib64/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7125, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "detailing.py", line 33, in OnInit
    self.database()
  File "detailing.py", line 87, in database
    [databasename,host,user,password]=pickle.load(self.fp)
  File "/usr/lib64/python2.4/pickle.py", line 1390, in load
    return Unpickler(file).load()
  File "/usr/lib64/python2.4/pickle.py", line 872, in load
    dispatch[key](self)
  File "/usr/lib64/python2.4/pickle.py", line 894, in load_eof
    raise EOFError
EOFError

我究竟做错了什么?

4

4 回答 4

14

除非您有错字,否则问题可能出在您将文件句柄分配给selffpnot的这一行中self.fp

selffp=file("detailing.dat","rb")

如果这是一个错字,并且您的代码实际上将文件打开到self.fp,那么您可能希望验证该文件是否确实具有内容(即:以前的泡菜工作)...错误表明该文件是空的。

编辑:在对这个答案的评论中,S. Lott 很好地总结了为什么拼写错误会产生你看到的错误,我在这里粘贴以保证答案的完整性:“selffp 将是未使用的打开文件,而 self.fp (旧的关闭文件)将用于加载”。

于 2009-03-31T13:21:31.363 回答
5

这是我推荐使用的版本:

def database(self):
    databasename=""
    host=""
    user=""
    password=""
    try:
        self.fp=open("detailing.dat","rb")
    except IOError:
        with open("detailing.dat", "wb") as fp:
            pickle.dump([databasename,host,user,password],fp,-1)

        self.fp=open("detailing.dat","rb")
        [databasename,host,user,password]=pickle.load(self.fp)

    return

正如已经指出的那样,self.fp 上有一个错字。但我注意到还有其他一些可能会导致问题的事情。

首先,您不应该直接使用文件构造函数。您应该改用内置的 open 函数。

其次,您应该避免在 finally 块之外调用文件的关闭方法。在这种情况下,我使用了带有块的 python 2.6。您可以在 Python 2.5 中通过以下命令使用它:

from __future__ import with_statement

如果在任何地方抛出异常,这将防止文件被卡在打开状态(因为它会在退出 with 块时关闭文件)。虽然这不是您的问题的原因,但记住这一点很重要,因为如果文件对象的方法之一抛出异常,该文件将在 sys.traceback 中无限期地保持打开状态。

(请注意,您可能应该接受 Jarret Hardie 的回答,但他发现了这个错误 :-))

于 2009-03-31T13:48:23.157 回答
1

当我没有选择正确的模式来读取文件(wb而不是rb)时,我收到了这个错误。改回rb并不足以解决问题。但是,再次生成一个新的干净泡菜文件解决了这个问题。似乎没有选择正确的模式来打开二进制文件会以某种方式“损坏”该文件,然后该文件将无法打开。

但我是 Python 的初学者,所以我可能也错过了一些东西。

于 2016-07-27T12:35:28.603 回答
0

虽然这不是对 OP 问题的直接答案——我在寻找EOFError尝试使用 : 解开二进制文件的原因时偶然发现了这个答案pickle.load(open(filename, "r"))

import cPickle as pickle 
A = dict((v, i) for i, v in enumerate(words))
with open("words.pkl", "wb") as f:
    pickle.dump(A, f)



#...later open the file -- mistake:trying to read a binary with non-binary method
with open("words.pkl", "r") as f:
    A =pickle.load(f) # EOFError


# change that to
with open ("words.pkl", "rb") as f: # notice the "rb" instead of "r"
    A = pickle.load(f)
于 2016-07-13T17:17:19.063 回答