Pertanyaan EOFError dengan skrip Python


Saya memiliki fragmen kode berikut:

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

Ini memiliki kesalahan:

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

Apa yang saya lakukan salah?


5
2018-03-31 13:12


asal


Jawaban:


Kecuali Anda memiliki kesalahan ketik, masalahnya mungkin di baris ini di mana Anda menetapkan pegangan file selffp tidak self.fp:

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

Jika itu salah ketik, dan kode Anda benar-benar membuka file self.fp, maka Anda mungkin ingin memverifikasi bahwa file benar-benar memiliki isi (yaitu: bahwa acar sebelumnya bekerja) ... kesalahan menunjukkan bahwa file tersebut kosong.

Edit: Dalam komentar untuk jawaban ini, S. Lott memiliki ringkasan yang bagus tentang mengapa kesalahan ketik menghasilkan kesalahan yang Anda lihat bahwa saya menempel di sini untuk kelengkapan jawaban: "selffp akan menjadi file yang tidak terpakai terbuka, dan self.fp (file lama yang ditutup) akan digunakan untuk memuat ".


14
2018-03-31 13:21



Inilah versi yang saya sarankan untuk digunakan:

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

Seperti telah ditunjukkan, ada kesalahan ketik pada self.fp. Tetapi di sini ada beberapa hal lain yang saya perhatikan yang dapat menyebabkan masalah.

Pertama-tama, kamu seharusnya tidak menggunakan konstruktor file secara langsung. Sebagai gantinya, Anda harus menggunakan fungsi terbuka bawaan.

Kedua, Anda harus menghindari memanggil metode dekat file di luar blok akhirnya. Dalam hal ini, saya telah menggunakan python 2.6 dengan blok. Anda dapat menggunakan ini dengan Python 2.5 dengan perintah berikut:

from __future__ import with_statement

Ini akan mencegah file dari macet terbuka jika pengecualian dilempar ke mana saja (karena akan menutup file ketika blok dengan keluar). Meskipun ini bukan penyebab masalah Anda, itu adalah hal penting untuk diingat karena jika salah satu metode objek file itu melempar pengecualian, file tersebut akan dibuka secara sys.traceback tanpa batas.

(perhatikan bahwa Anda mungkin harus menerima jawaban Jarret Hardie, ia menangkap bug :-))


5
2018-03-31 13:48



Saya mendapat kesalahan ini ketika saya tidak memilih mode yang benar untuk membaca file (wb dari pada rb). Mengubah kembali ke rb tidak cukup untuk menyelesaikan masalah. Namun, menghasilkan lagi file acar bersih baru memecahkan masalah. Tampaknya tidak memilih mode yang benar untuk membuka file biner entah bagaimana "merusak" file yang kemudian tidak dapat dibuka sama sekali sesudahnya.

Tapi saya cukup pemula dengan Python jadi saya mungkin juga kehilangan sesuatu.


1
2017-07-27 12:35



Meskipun ini bukan jawaban langsung atas pertanyaan OP - saya menemukan jawaban ini sambil mencari alasan untuk itu EOFError ketika mencoba membongkar file biner dengan: 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)

0
2017-07-13 17:17