EOFError в скрипте Python - PullRequest
       36

EOFError в скрипте Python

5 голосов
/ 31 марта 2009

У меня есть следующий фрагмент кода:

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 ]

14 голосов
/ 31 марта 2009

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

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

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

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

5 голосов
/ 31 марта 2009

Вот версия, которую я бы порекомендовал использовать:

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

Прежде всего, вы не должны напрямую использовать конструктор файлов . Вместо этого вы должны использовать встроенную функцию открытия.

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

from __future__ import with_statement

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

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

1 голос
/ 27 июля 2016

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

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

0 голосов
/ 13 июля 2016

Хотя это не прямой ответ на вопрос ОП - я столкнулся с этим ответом, когда искал причину 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)
...