简体   繁体   English

Python 脚本中的 EOFError

[英]EOFError in Python script

I have the following code fragment:我有以下代码片段:

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

It has the error:它有错误:

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

What am I doing wrong?我究竟做错了什么?

Unless you've got a typo, the issue may be in this line where you assign the file handle to selffp not self.fp :除非您有错字,否则问题可能出在您将文件句柄分配给selffp而不是self.fp的这一行:

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

If that is a typo, and your code actually opens the file to self.fp , then you may wish to verify that the file actually has contents (ie: that the previous pickle worked)... the error suggests that the file is empty.如果这是一个错字,并且您的代码实际上将文件打开到self.fp ,那么您可能希望验证该文件是否确实具有内容(即:以前的泡菜工作)...错误表明该文件是空的.

Edit: In the comments to this answer, S. Lott has a nice summary of why the typo generated the error you saw that I'm pasting here for completeness of the answer: "selffp will be the unused opened file, and self.fp (the old closed file) will be used for the load".编辑:在对这个答案的评论中,S. Lott 很好地总结了为什么拼写错误会产生你看到的错误,我在这里粘贴以保证答案的完整性:“selffp 将是未使用的打开文件,而 self.fp (旧的关闭文件)将用于加载”。

Here's the version that I would recommend using:这是我推荐使用的版本:

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

As has been pointed out, there was a typo on self.fp.正如已经指出的那样,self.fp 上有一个错字。 But here are a few other things that I notice that can cause problems.但我注意到还有其他一些可能会导致问题的事情。

First of all, you shouldn't be using the file constructor directly .首先,您不应该直接使用文件构造函数 You should instead use the built-in open function.您应该改用内置的开放式 function。

Secondly, you should avoid calling a file's close method outside a finally block.其次,您应该避免在 finally 块之外调用文件的关闭方法。 In this case, I've used python 2.6's with block.在这种情况下,我使用了 python 2.6 的块。 You can use this in Python 2.5 with the following command:您可以使用以下命令在 Python 2.5 中使用它:

from __future__ import with_statement

This will prevent the file from being stuck open if an exception is thrown anywhere (as it will close the file when the with block is exited).如果在任何地方抛出异常,这将防止文件被卡在打开状态(因为它会在退出 with 块时关闭文件)。 Although this isn't the cause of your problem, it is an important thing to remember because if one of the file object's methods throws an exception, the file will get held open in sys.traceback indefinitely.虽然这不是您的问题的原因,但记住这一点很重要,因为如果文件对象的方法之一抛出异常,该文件将无限期地在 sys.traceback 中保持打开状态。

(note that you should probably accept Jarret Hardie's answer though, he caught the bug:-) ) (请注意,您可能应该接受 Jarret Hardie 的回答,但他发现了这个错误:-))

I got this error when I didn't chose the correct mode to read the file ( wb instead of rb ).当我没有选择正确的模式来读取文件( wb而不是rb )时,我收到了这个错误。 Changing back to rb was not sufficient to solve the issue.改回rb不足以解决问题。 However, generating again a new clean pickle file solved the issue.但是,再次生成一个新的干净泡菜文件解决了这个问题。 It seems that not choosing the correct mode to open the binary file somehow "damages" the file which is then not openable whatsoever afterward.似乎没有选择正确的模式来打开二进制文件会以某种方式“损坏”该文件,然后该文件将无法打开。

But I am quite a beginner with Python so I may have miss something too.但我是 Python 的初学者,所以我可能也错过了一些东西。

While this is not a direct answer to the OP's question -- I happened upon this answer while searching for a reason for an EOFError when trying to unpickle a binary file with: pickle.load(open(filename, "r")) .虽然这不是对 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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM