Don't learn to code. Code to learn!

Сегодня мы напишем приложение-пример, которое будет принимать от пользователя его имя и результат, после чего - форматировать и записывать в файл список из 10 лучших результатов. Это достаточно простое приложение, однако на его примере мы попрактикуемся в работе с файлами в Python, генерации списков, продвинутой работе со строками, расширенном использовании метода sort, обработке исключительных ситуаций.

Узнаем имя и результат пользователя:

name = input('Your name: ')
score = input('Your score: ')

Тепер открываем файл с результатами, eсли файла не существует - создадим его и заполним демо-данными:

try:
    scores = open("scores.txt")
except (OSError, IOError):
    scores = open('scores.txt', 'w')
    scores.write('1. AAA 1000\n2. CCC 700\n3. BBB 200')
    scores.close()
    scores = open("scores.txt")

Читаем содержимое файла и форматируем список content. В файле хранятся записи формата:

Позиция. Имя Результат

файл до запуска программы, file before insertions

Список content генерируется следующим образом:

scores = open("scores.txt")
content = ['{} {}'.format(s.split()[1],
                          s.split()[2]) for s in scores.read().split('\n')]
scores.close()

На первой строке мы открываем файл scores.txt, на последней - закрываем. Самое интересное происходит посередине. Мы читаем содержимое файла и создаем список из строк формата 'Имя Результат'. Далее мы добавляем в этот список строку содержащую введенные нами имя и результат.

content.append('{} {}'.format(name, score))

После этого, наша задача отсортировать весь список на основе результата. Для этого воспользуемся встроенной функцией sort.

content.sort(key=get_key, reverse=True)

reverse=True означает, что список будет форматироваться от большего к меньшему. В Python функция sort позволяется нам работать очень гибко, одним из параметров, которые она принимает, является ключевой аргумент key, которым мы можем задать функцию на основе которой будет производится сортировка. Давайте напишем такую функцию (обратите внимание, что функция должна быть определена до строки content.sort...):

def get_key(item):
    return int(item.split()[1])

Готово! Список отсортирован. Теперь нужно перезаписать файл scores.txt, заполнив его десятью лучшими результатами. Для начала создадим переменную text:

text = '\n'.join(['{}. {}'.format(i, item) for i, item in enumerate(content[:10], start=1)])

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

text = ''
for i, item in enumerate(content[:10], start=1):
    text += '{}. {}\n'.format(i, item)

Однако такой вариант это по сути лишняя трата процессорного времени и лишние строки в коде.

Напечтаем то, что у нас получилось, чтобы получить хоть какую-то визуализацию, и запишем переменную в файл:

print(text)
scores = open("scores.txt", 'w')
scores.write(text)
scores.close()

Все работает, как и ожидалось!

запуск программы из терминала 

Получаем вот такую картину

файл после вызова нескольких запусков приложения