2009-03-31 31 views
5

Tôi đã đoạn mã sau:EOFError bằng Python script

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 

Nó đã được báo lỗi:

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 

Tôi đang làm gì sai?

Trả lời

14

Trừ khi bạn đã có một typo, vấn đề có thể nằm trong dòng này, nơi bạn gán các tập tin xử lý để selffp không self.fp:

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

Nếu đó là một lỗi đánh máy, và mã của bạn thực sự mở file đến self.fp, sau đó bạn có thể muốn xác minh rằng tệp thực sự có nội dung (ví dụ: công thức dưa trước đó đã hoạt động) ... lỗi cho thấy tệp đó trống.

Chỉnh sửa: Trong nhận xét cho câu trả lời này, S. Lott có tóm tắt tốt về lý do lỗi đánh máy bạn thấy rằng tôi đang dán vào đây để hoàn thành câu trả lời: "selffp sẽ là tệp chưa được mở, và self.fp (tệp đã đóng cũ) sẽ được sử dụng cho tải ".

+0

+1: Vị trí tuyệt vời. selffp sẽ là tập tin chưa được mở, và self.fp (tập tin đã đóng cũ) sẽ được sử dụng cho tải. –

5

Dưới đây là phiên bản mà tôi muốn giới thiệu cách sử dụng:

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 

Như đã chỉ ra, đã có một lỗi đánh máy trên self.fp. Nhưng đây là một vài điều khác mà tôi nhận thấy có thể gây ra vấn đề.

Trước hết, bạn shouldn't be using the file constructor directly. Thay vào đó, bạn nên sử dụng chức năng mở được cài sẵn.

Thứ hai, bạn nên tránh gọi phương thức đóng của tệp bên ngoài khối cuối cùng. Trong trường hợp này, tôi đã sử dụng python 2.6 với khối. Bạn có thể sử dụng bằng Python 2.5 với lệnh sau đây:

from __future__ import with_statement 

này sẽ ngăn chặn các tập tin không bị mắc kẹt mở nếu một ngoại lệ được ném bất cứ nơi nào (vì nó sẽ đóng file khi với khối được thoát). Mặc dù đây không phải là nguyên nhân gây ra vấn đề của bạn, nhưng điều quan trọng cần nhớ là nếu một trong các phương thức của đối tượng tệp đưa ra một ngoại lệ, tệp sẽ được mở trong sys.traceback vô thời hạn.

(lưu ý rằng bạn có lẽ nên chấp nhận câu trả lời Jarret Hardie của Mặc dù vậy, ông bắt được :-) bug)

+0

+1: sạch hơn nhiều và có lời khuyên tốt về các vấn đề khác trong đoạn trích –

0

Trong khi đây không phải là một câu trả lời trực tiếp câu hỏi của OP - Tôi đã xảy ra khi câu trả lời này trong khi tìm kiếm một lý do cho một EOFError khi cố gắng giải nén tệp nhị phân bằng: 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

tôi đã nhận lỗi này khi tôi đã không chọn phương thức đúng để đọc các tập tin (wb thay vì rb). Thay đổi lại thành rb không đủ để giải quyết vấn đề. Tuy nhiên, việc tạo lại một tệp dưa chuột sạch mới đã giải quyết được vấn đề. Dường như không chọn chế độ đúng để mở tệp nhị phân bằng cách nào đó "làm hỏng" tệp mà sau đó không thể mở được sau đó.

Nhưng tôi khá mới bắt đầu với Python nên tôi có thể đã bỏ lỡ điều gì đó.

Các vấn đề liên quan