2013-02-14 2 views
2

Хорошо, поэтому в основном я делаю простую игру, которая включает в себя рекорды. Я бы хотел, чтобы рекорд был сохранен, если он больше, чем предыдущий рекорд. Это мой код. У меня есть несколько разных ошибок, некоторые из которых связаны с тем, что я переключаюсь между строками и целыми числами и другими ошибками, потому что мой код явно неправильный. Я дал ему достаточно усилий, чтобы попытаться понять проблему, но новые ошибки, похоже, продолжаются.Как заменить слово в txt-файле

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 = hiscore.replace(hiscore, score) 
    hisc.write(hiscore) 

Это была моя последняя попытка на этом. Это может быть на 100% неправильным, я приложил все усилия. Мне нужно, чтобы всякий раз, когда я запускаю игру, он показывает мой высокий балл. Если мой балл больше моего рекорда, изменяется рекордер в текстовом файле. Затем он перезагружается в игру, чтобы снова действовать в этом коде.

+0

Что такое переменная оценка? int или string? – placeybordeaux

+1

оценка - это int, а мой оригинальный рекордер в текстовом документе - 0 –

+0

@kennym 'r +' предназначен для чтения и записи. – squiguy

ответ

3

Проблема с вашим кодом заключается в том, что вы пытаетесь позвонить 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) 

Однако, у вас есть вторая проблема: Вы пишете int в файл, когда то, что вы хотите (я думаю) является строковым представлением, что int как именно 3 символов. Таким образом, заменить эту последнюю строку с этим:

hisc.write('{:3}'.format(hiscore)) 

Между тем, открытие файла в режиме "r+" не может делать то, что вы думаете, что он делает. В Python 3 «чтение указателя» и «указатель записи» всегда находятся в одном месте для файла «r +». Итак, если вы прочитали 3 символа, а затем напишите 3 символа, вы закончите переписывание символов 3-6 или добавление 3 новых символов в конец, вместо того, чтобы переписывать символы 0-3, как вы хотите. Вы можете справиться с этим, позвонив по телефону seek(0, 0) после read.

Наконец, вы никогда не делаете close файл, что означает, что все, что вы написали, возможно, никогда не будет спасено - оно может сидеть в буфере в памяти и никогда не сбрасываться в фактический файл диска. И, вероятно, здесь проще просто открыть для чтения, затем закрыть, затем открыть для записи, а затем закрыть, так что вам не нужно беспокоиться обо всем этом, но не нужно. Самый простой способ закрыть файлы - использовать оператор 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 module Overview объясняет большую часть этого, но это не совсем новичок. Reading and Writing Files в руководстве может быть более полезным.

+0

Это было полезно. Но это не совсем сработало. Я остался со счетом, записанным в текст, без фактического удаления предыдущего рекорда. Итак, у меня было 12345678910111213 и т. Д. –

+0

@DennisCallanan: Обновлен ответ, чтобы объяснить это и как с этим бороться. И я обновлю его снова с некоторыми ссылками, когда я их соберу. – abarnert

+0

Я очень ценю помощь. Я получаю ошибку: highscore = int (hiscore) ValueError: недействительный литерал для int() с базой 10: '' –

Смежные вопросы