我试图为我的游戏保存一个分数。我有一段示例代码,为什么它不能保存,如果是这样,我将如何修复它?
hisc = open("highscore.txt","w+")
hi = hisc.read()
if hi == '':
hisc.write('0')
hi = '0'
if score > int(hi):
hisc.write(str(score))
print("NEW HIGHSCORE!")
else:
print("HIGHSCORE =",hi)
答案 0 :(得分:2)
存在一些问题:首先,您不能将w+
用作分数列表的文件模式,因为它opens for reading & writing, truncating the file first。因此,每次使用w+
打开文件时,它首先会删除它,因此每次都会有一个空文件。你想要r+
。
其次,我已删除hisc.write('0')
。因为我们无论如何都将空文件视为零,并且如果空的话会立即用高分来覆盖它,这没有用。
第三,不鼓励手动打开/关闭文件。相反,请使用context manager
最后,我们需要seek(0)
回到文件的开头,否则我们会将得分追加到最后。如果我们希望能够重置高分榜(可能会使其更小,我们在完成写作后需要truncate()
以删除剩余的额外内容。
with open("highscore.txt", "r+") as hisc:
hi = hisc.read()
if not hi: # not hi will only be true for strings on an empty string
hi = '0'
if score > int(hi):
print("NEW HIGHSCORE!")
hisc.seek(0) # We already read to the end. We need to go back to the start
hisc.write(str(score))
hisc.truncate() # Delete anything left over... not strictly necessary
else:
print("HIGHSCORE =%s" % hi)
答案 1 :(得分:1)
每次都可以在python中使用上下文管理器。这将帮助您避免与关闭资源相关的错误,并为您节省大量的调试时间。
如果您不知道上下文管理器是什么,请查看: http://book.pythontips.com/en/latest/context_managers.html
new_score = 100
with open("highscore.txt", "r") as high_file:
stored_val = high_file.read()
high_score = int(stored_val) if stored_val else 0
with open("highscore.txt", "w") as high_file:
if new_score > int(high_score):
high_file.write(str(new_score))
print("NEW HIGHSCORE!")
else:
print("HIGHSCORE =", high_score)
编辑:我必须编辑示例代码,并根据注释使其完全正常运行。这段代码在python3上完美运行。
答案 2 :(得分:1)
在这种情况下,您应该使用with
和as
打开文本文件。
with open("foo.txt", "w") as bar:
# code that references bar goes here
这个方法的好处在于它会自动为您关闭文件,并为您处理其他一些事情。
在您的情况下,它看起来像这样:
with open("highscore.txt", "w+") as hisc:
hi = hisc.read()
if hi == '':
hisc.write('0')
hi = '0'
if score > int(hi):
hisc.write(str(score))
print("NEW HIGHSCORE!")
else:
print("HIGHSCORE =",hi)
答案 3 :(得分:0)
正如@swimmingduck所说,所以需要在代码的末尾添加hisc.close()
,因为没有它,Python就不会意识到你已经写完了文件。