2009-03-31 6 views
5

Я следующий фрагмент кода:EOFError в сценарии Python

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 

Что я делаю неправильно?

ответ

14

Если вы не получили опечатку, то проблема может быть в этой строке, где вы назначаете дескриптор файла для selffp не self.fp:

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

Если это опечатка, и ваш код открывает файл до self.fp, то вы можете убедиться, что файл имеет на самом деле содержимое (то есть, что предыдущий рассол работал) ... ошибка говорит о том, что файл пуст.

Редактировать: В комментариях к этому ответу С. Лотт имеет хорошее резюме о том, почему опечатка породила ошибку, которую вы видели, что я вставляю здесь для полноты ответа: «selffp будет неиспользуемым открытым файлом, и self.fp (старый закрытый файл) будет использоваться для загрузки ».

+0

+1: Отличное место. selffp будет неиспользуемым открытым файлом, а self.fp (старый закрытый файл) будет использоваться для загрузки. –

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. Но вот несколько других вещей, которые, как я заметил, могут вызвать проблемы.

Прежде всего, вы shouldn't be using the file constructor directly. Вместо этого вы должны использовать встроенную функцию open.

Во-вторых, вы должны избегать вызова метода закрытия файла вне блока finally. В этом случае я использовал python 2.6 с блоком. Вы можете использовать это в Python 2.5 с помощью следующей команды:

from __future__ import with_statement 

Это предотвратит файл застрял открытой, если исключение в любом месте (как это будет закрыть файл, когда с блоком вышел). Хотя это и не является причиной вашей проблемы, важно помнить, потому что, если один из методов файлового объекта генерирует исключение, файл будет оставаться открытым в sys.traceback на неопределенный срок.

(обратите внимание, что вы, вероятно, следует принять ответ JARRET Гарди в хотя, он поймал ошибка :-))

+0

+1: намного чище, и с хорошими советами по другим вопросам в фрагменте –

0

Хотя это не является прямым ответом на вопрос ФП в - я наткнулся на этот ответ при поиске причина для 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) 
1

Я получил эту ошибку, когда я не выбрал правильный режим для чтения файла (wb вместо rb). Переход на rb был недостаточным для решения проблемы. Однако, снова создавая новый чистый файл pickle, проблема решена. Кажется, что не выбирая правильный режим для открытия двоичного файла, он каким-то образом «повреждает» файл, который впоследствии не открывается.

Но я довольно новичок в Python, поэтому, возможно, я тоже что-то пропустил.

Смежные вопросы