我正在尝试从文件中获取一个 pickled 列表,但我总是出错。是否需要在每个函数内对同一文件中的同一对象进行 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)
请您参考如下方法:
您要在打开的文件上使用 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]
