Python, сохранение последних 3 баллов в файл

current_class = Classes[student_class] #Used to get the value of the key in Classes
class_score = open(current_class, 'a+') #Scores must be appended and not written to avoid overwriting data
class_format = (name + ' scored ' + str(Score) + '\n') #This is the format in which the text file will save the data as
class_score.write(class_format) #Writing the scores to the text file using the format above
class_read = class_score.read() #For some reason, the scores will not be added to the text file unless I add this text (Using OSX)

Я использую этот код для сохранения оценок (вводимое имя) в текстовый файл. Есть 3 текстовых файла, и в зависимости от того, в каком классе вы находитесь (класс ввода пользователя), он сохраняет оценку в классе 1, 2 или 3.

Однако этот процесс можно повторить 1000 раз, и если введено одно и то же имя, «Имя» может иметь 1000 баллов. Как бы я мог ограничить его, чтобы при добавлении оценки в текстовый файл он сохранял только 3 самых последних оценки

РЕДАКТИРОВАТЬ: я немного разработал код, но до сих пор не знаю, как заставить его заменить «самую старую» оценку.

current_class = Classes[student_class] #Used to get the value of the key in Classes
class_score = open(current_class, 'a+') #Scores must be appended and not written to avoid overwriting data
class_format = (name + ' scored ' + str(Score) + '\n') #This is the format in which the text file will save the data as
class_read = class_score.read()
class_count = class_read.count(name)
while True:
    if class_count > 3:

    else:
        class_score.write(class_format) #Writing the scores to the text file using the format above
        break

person Imran Chowdhury    schedule 28.04.2016    source источник
comment
Вы либо будете читать файл каждый раз, когда будет записана новая партитура и проанализированы партитуры. Или вы можете сохранить все хранилища в структуре данных памяти, поместить в нее текущую оценку на основе вашей логики, а затем перезаписать файл текущими оценками.   -  person    schedule 28.04.2016
comment
Вы можете запустить базу данных sqlite и сделать функцию для тупой базы данных.   -  person Snuggert    schedule 28.04.2016
comment
@Snuggert, просматривающий базы данных sqlite прямо сейчас, свяжется с вами   -  person Imran Chowdhury    schedule 28.04.2016
comment
Передайте 0 для аргумента buffering open, чтобы каждый раз сбрасывать запись.   -  person David Cullen    schedule 28.04.2016


Ответы (1)


Если вы хотите ограничить файл только тремя последними партитурами, то перед записью в файл откройте его для чтения и прочитайте/разберите предыдущие три партитуры.

class_score = open(current_class, 'r')
prev_scores = []
for line in class_score:
  prev_scores.append(line)

class_score.close()
class_score = open(current_class, 'w')
for p in prev_scores[1:]:
  class_score.write(p)

class_score.write(class_format)
person kingledion    schedule 28.04.2016
comment
Я реализовал это в своем коде, однако после тестирования обнаружил несколько ошибок. Я изменил «w» на «a +», потому что я не хочу перезаписывать весь файл, а также мой python, похоже, не записывает, если я не включу «class_score.read ()» под функцию записи. Кроме того, когда добавляется третья оценка, вторая оценка повторяется, поэтому она показывает 4 оценки вместо 3. РЕДАКТИРОВАТЬ: кажется, что этот код работает только для «одного человека», однако пользователь может ввести свое имя, поэтому мы можем предположить, если пользователь использует два разных имени, это два разных человека - person Imran Chowdhury; 28.04.2016
comment
Таким образом, заменив «w» на «a+», вы измените функциональность программы. 'w' стирает предыдущий файл и перезаписывает его. Добавляя ('a+'), вы оставляете некоторые из предыдущих данных, поэтому будет несколько копий вновь вставленных данных. - person kingledion; 28.04.2016
comment
class_score.read() читает весь файл. Поскольку вы не присваиваете его переменной, эти данные просто исчезают. Ваш питон должен быть таким же, как и все остальные. После того, как вы напишите, либо вызовите class_score.close(), либо дайте скрипту завершиться, и записи должны быть зафиксированы в файле по желанию. - person kingledion; 28.04.2016
comment
Имя пользователя является частью class_format. Я не добавлял определение class_format в свой фрагмент кода выше. - person kingledion; 28.04.2016