5

次のコードフラグメントがあります。

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

4 に答える 4

14

タイプミスがない限り、ファイルハンドルをselffpnotに割り当てる次の行に問題がある可能性がありself.fpます。

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

それがタイプミスであり、あなたのコードが実際に にファイルを開くself.fp場合、ファイルに実際にコンテンツがあることを確認したい場合があります (つまり、前の pickle が機能したこと)...エラーはファイルが空であることを示唆しています。

編集: この回答へのコメントで、S. Lott は、回答の完全性のためにここに貼り付けていることを確認したエラーが発生した理由について、S. Lott にすばらしい要約があります。 (古い閉じたファイル)がロードに使用されます。」

于 2009-03-31T13:21:31.363 に答える
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 にタイプミスがありました。しかし、問題を引き起こす可能性があることに気付いた他のいくつかのことを次に示します。

まず、ファイル コンストラクターを直接使用しないでください。代わりに、組み込みの open 関数を使用する必要があります。

次に、finally ブロックの外でファイルの close メソッドを呼び出さないようにする必要があります。この場合、ブロック付きの python 2.6 を使用しました。次のコマンドを使用して、Python 2.5 でこれを使用できます。

from __future__ import with_statement

これにより、どこかで例外がスローされた場合にファイルが開いたままになるのを防ぐことができます (with ブロックが終了するとファイルが閉じられるため)。これは問題の原因ではありませんが、ファイル オブジェクトのメソッドの 1 つが例外をスローすると、ファイルが sys.traceback で無期限に開いたままになるため、覚えておくことが重要です。

(ただし、おそらくJarret Hardieの回答を受け入れる必要があることに注意してください。彼はバグをキャッチしました:-))

于 2009-03-31T13:48:23.157 に答える
1

wbこのエラーは、ファイルを読み取るための正しいモード (ではなく)を選択しなかったときに発生しましたrb。に戻すrbだけでは、問題を解決するには不十分でした。ただし、新しいクリーンな pickle ファイルを再度生成すると、問題は解決しました。バイナリファイルを開くための正しいモードを選択しないと、何らかの形でファイルが「損傷」し、後で開くことができなくなるようです。

しかし、私はPythonの初心者なので、何かを見落としているかもしれません。

于 2016-07-27T12:35:28.603 に答える
0

EOFErrorこれは OP の質問に対する直接の回答ではありませんが、バイナリ ファイルを : で unpickle しようとしたときの理由を探しているときに、この回答に出くわしました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)
于 2016-07-13T17:17:19.063 に答える