Python脚本中的EOR

Python脚本中的EOR,python,pickle,raw-input,eoferror,Python,Pickle,Raw Input,Eoferror,我有以下代码片段: 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,p

我有以下代码片段:

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

我做错了什么?

除非您有输入错误,否则问题可能在这一行,您将文件句柄分配给
selffp
而不是
self.fp

selffp=file("detailing.dat","rb")
如果这是一个输入错误,并且您的代码实际上将文件打开到
self.fp
,那么您可能希望验证该文件是否确实包含内容(即:上一个pickle有效)。。。该错误表明该文件为空


编辑:在对这个答案的评论中,S.Lott很好地总结了打字错误产生错误的原因,我在这里粘贴这个错误是为了答案的完整性:“selffp将是未使用的打开文件,self.fp(旧的关闭文件)将用于加载”。

以下是我建议使用的版本:

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块之外调用文件的close方法。在本例中,我将Python2.6与block一起使用。您可以在Python 2.5中使用以下命令:

from __future__ import with_statement
这将防止在任何地方引发异常时文件被卡住打开(因为退出with块时它将关闭文件)。尽管这不是问题的原因,但必须记住这一点,因为如果文件对象的某个方法引发异常,该文件将在sys.traceback中无限期保持打开状态


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

虽然这不是OP问题的直接答案——我在试图用以下命令解除二进制文件的pickle.load(open(filename,“r”)解压时偶然发现了这个答案:
EOFError


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


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

+1:非常好的位置。selffp将是未使用的打开文件,self.fp(旧的关闭文件)将用于加载。+1:更干净,并且对代码段中的其他问题有很好的建议
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)