2

ファイルからピクルスのリストを取得しようとしていますが、エラーが発生し続けます。同じファイルから同じオブジェクトを unpickle することは、すべての関数内で行う必要がありますか、それとも一度 unpickle しても問題ありませんか?

最後に試したのは次のとおりです。

import pickle, sys

def openFile(fileName, mode):
    """Open a file."""

    try:
        file =  open(fileName, mode)
    except IOError as e:
        print("Unable to open the file", fileName)
        print(e)
        input("Press the enter key to exit.")
        sys.exit()
    else:
        return file

def writeScore(file, score):
    """Write score to file."""

    try:
        highScores = pickle.load(file)
    except IOError as e:
        print("File doesn't exist.")
        print(e)
    except EOFError as e:
        print("File is empty.")
        print(e)
    else:
        highScores.append(score)
        highScores = highScores.sort()
        pickle.dump(highScores, file)

score_file = openFile("highScores.dat", "ab+")
writeScore(score_file, 1000)
score_file.close()

score_file = openFile("highScores.dat", "rb")
highScore = pickle.load(score_file)
print(highScore)
4

1 に答える 1

1

pickle.load()読み取り用ではなく、追加用に開かれたファイルで使用しようとしています。その上、あなたの関数openFile()は基本的に と同じopen()です。

私のおすすめ:

import pickle

def writeScore(file_, score):
    """Write score to file."""

    try:
        cache_file = open(file_, 'rb')
    except IOError:
        open(file_, 'a').close()
        cache_file = open(file_, 'rb')

    try:
        highScores = pickle.load(cache_file)
        highScores.append(score)
        highScores.sort()
    except EOFError:
        highScores = [score]
    finally:
        cache_file.close()

    writing_file = open(file_, 'wb')
    pickle.dump(highScores, writing_file)
    writing_file.close()

def displayScores(file_):
    """Display score from file."""

    cache_file = open(file_, 'rb')
    try:
        print pickle.load(cache_file)
    except (EOFError, IOError):
        print 'No scores to display.'

if __name__ == '__main__':
    scores_file = 'highScores.dat'

    writeScore(scores_file, 2000)
    displayScores(scores_file)

    writeScore(scores_file, 1000)
    displayScores(scores_file)

または、さらに良いことに、を使用しますshelve。その場合、関数は必要ありません。

import shelve

def startDatabase(file_):
    """Creates a shelve from file."""

    return shelve.open(file_, writeback=True)

def writeScore(database, score):
    """Write score to file."""

    try:
        database['scores'].append(score)
        database['scores'].sort()
    except KeyError:
        database['scores'] = [score]

def displayScores(database):

    try:
        print database['scores']
    except KeyError:
        print 'No scores to display.'

if __name__ == '__main__':
    db = startDatabase('highScores.dat')

    displayScores(db)

    writeScore(db, 2000)
    displayScores(db)

    writeScore(db, 1000)
    displayScores(db)

    db.close()

どちらも同じ出力が得られます。

No scores to display.
[1000]
[1000, 2000]
于 2013-07-19T00:27:31.267 に答える