Python: извлечение чисел из текстового файла и запись в файл с помощью оператора try - PullRequest
0 голосов
/ 27 апреля 2020

Хорошо, я пытаюсь использовать оператор Try, чтобы увидеть, можно ли открыть файл. Если он может проверить, меньше ли это число, чем оценка пользователя, и если это так, запишите новый высокий балл.

часть Else описывает, что если файл не существует, напишите новый с высокий балл

Однако, похоже, ничего не работает. Он либо записывает высокий балл дважды, либо независимо от того, ниже он или выше.

try:
    highscore = open('highscore.txt', 'r')
    score_line = highscore.readlines()
    read_score = re.findall(r"\d+", str(score_line))
    score = [int(num) for num in read_score]
    highscore.close()

    if score[0] < total_points:
        highscore = open('highscore.txt', 'a')

        highscore.write('\nScore: ' + str(total_points)
                        + '\nName: ' + name
                        + '\n')
        print('Your highscore has been saved!')
        highscore.close()
    else:
        pass
except OSError:
    pass
else:
    highscore = open('highscore.txt', 'a')

    highscore.write('\nScore: ' + str(total_points)
                    + '\nName: ' + name
                    + '\n')
    highscore.close()

    print('Your highscore has been saved!')

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вместо «попробуй, кроме прочего» ты можешь использовать простой if. Этот код записывает рекорд в файле highscore.txt. Если файл не существует, этот код создаст файл и запишет текущую оценку как высокую оценку.

    import os
    import re
    txt_file = 'highscore.txt'# if the txt file is not in the same folder then provide the full path
    score = 50 #current score
    name= 'Sachin'
    data = f'''Name: {name}
    Score: {score}
    '''

    # if the text file doesn't exists write the current score as high score
    if not os.path.exists(txt_file):
        with open(txt_file,'w') as f:
            f.write(f'{data}')

    #read the score
    with open(txt_file,'r') as f:
        previous_score = f.read()
        previous_score = re.search('\d+',previous_score).group(0)

    # compare the previous score with current score and write the highest score with name
    if int(previous_score) < int(score):
        with open(txt_file,'w') as f:
            f.write(f'{data}')
0 голосов
/ 27 апреля 2020

Давайте рассмотрим несколько вещей одну за другой:

  • Вопрос: Создайте минимальный пример
  • Ответ: Почему ваш try / else не работает
  • Лучший практика: сделайте попытку / за исключением как можно более плотных
  • Лучшая практика: используйте 'с'

минимальное

Нам не нужны детали для попробуйте / кроме части:

try:
    highscore = open('highscore.txt', 'r')
    print highscore.read()
    highscore.close()
except OSError:
    pass
else:
    highscore = open('highscore.txt', 'a')
    highscore.write('foo')
    highscore.close()

Вопрос

Почему это не работает? Попытка / исключение / другое срабатывает, если есть без исключения , и за исключением при наличии исключения. Вы хотите, чтобы ваш код был в кроме части, и, следовательно, вам даже не нужно другое.

try:
    highscore = open('highscore.txt', 'r')
    print highscore.read()
    highscore.close()
except OSError:
    highscore = open('highscore.txt', 'a')
    highscore.write('foo')
    highscore.close()

Затяните попытку / кроме

Вы не нажмете OSError with (например: re.findall), поэтому давайте сделаем его как можно меньше.

Используйте с

Тогда вам не нужно закрывать файл самостоятельно.

Используйте json / yaml для хранения данных

Избегайте разбора регулярных выражений и большого количества строковых данных, используйте другой код для выбора формата вывода.

Используйте 'w' вместо 'a', если вы в любом случае просто перезаписываем файл

Окончательная рекомендуемая версия

PATH = 'highscore.json'
try:
    with open(PATH, 'r') as f:
        info = json.load(f)
except (OSError, json.JSONDecodeError):
    info = {}
score = info.get('score')
if score is None or score < total_points:
    with open(PATH, 'w') as f:
        json.dump({'name': name, 'score': total_points}, f)
    print('Your highscore has been saved!')
...