コードの問題は、 が のhiscore.replace
ときに呼び出そうとしていることです。hiscore
int
そもそもなぜ使おうとしているのかがよくわかりませんreplace
。これは、文字列の一部を別の文字列に置き換えるのに便利です。全体を置き換えたい場合は、新しい値を割り当てるだけです: hiscore = score
.
hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
hiscore = score
hisc.write(hiscore)
ただし、2 つ目の問題があります。出力をファイルに書き込んでいるint
ときに、(私が思うに)int
正確に 3 文字の文字列表現が必要な場合です。したがって、最後の行を次のように置き換えます。
hisc.write('{:3}'.format(hiscore))
一方、"r+"
モードでファイルを開くと、思ったように動作しない場合があります。Python 3 では、「r+」ファイルの「読み取りポインター」と「書き込みポインター」は常に同じ場所にあります。したがって、3 文字を読み取ってから 3 文字を書き込むと、必要に応じて文字 0 ~ 3 を上書きする代わりに、文字 3 ~ 6 を上書きするか、最後に 3 つの新しい文字を追加することになります。seek(0, 0)
の後に呼び出すことでこれに対処できread
ます。
つまり、書き込んだ内容は決してclose
保存されず、メモリ内のバッファに留まり、実際のディスク ファイルにフラッシュされることはありません。seek
ここでは、読み取り用に開いてから閉じ、書き込み用に開いてから閉じる方がおそらく簡単なので、ナンセンスなことを心配する必要はありません。ファイルを閉じる最も簡単な方法は、with
ステートメントを使用することです。
したがって、すべてをまとめると、次のようになります。
with open("Hscore.txt", "r") as hisc:
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
with open("Hscore.txt", "w") as hisc:
hisc.write('{:3}'.format(score))
ただし、これは、Hscore.txt が (現在の作業ディレクトリに) 存在し、その中に数値があることが保証されているという事実に依存しています。なんらかのバグにより、そこに「x」が表示されたり、ファイルが完全に空になったりすると、実行するたびに例外が発生し、回復できなくなります。したがって、次のようなものが必要になる場合があります。
try:
with open("Hscore.txt", "r") as hisc:
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
except IOError as e:
print('Warning: couldn't open "Hscore.txt": {}'.format(e))
highscore = 0
except ValueError as e:
print('Warning: couldn't convert "{}" from "Hscore.txt" to an integer: {}'.format(hiscore, e))
highscore = 0
そうすれば、問題の原因を突き止めるのに役立つ警告が出力され、回復も試みられます (ファイルが見つからないか破損している場合は、ハイスコアが 0 であると想定します)。
open
ドキュメントとio
モジュールの概要では、このほとんどについて説明していますが、まったく初心者向けというわけではありません。チュートリアルのファイルの読み取りと書き込みがより役立つ場合があります。