Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- #
- import csv
- from datetime import datetime
- import os
- """
- 10-NOV-2019
- HighScoreCSV: a class to handle a highscore file
- CSV file format:
- Score,Name,Created
- 3,Player,2019-11-10T11:43:23
- ...
- """
- class HighScoreCSV:
- """
- A highscore CSV file wrapper class
- """
- def __init__(self, csv_file, maxscores=10, verbose=False, create=True):
- """
- constructor
- """
- self.__csv_file = None
- if isinstance(csv_file, str):
- self.__csv_file = csv_file
- if create:
- if not os.path.isfile(csv_file):
- try:
- with open(csv_file, 'a'):
- pass
- except Exception as e:
- print(e)
- self.__csv_file = None
- if isinstance(maxscores, int):
- if maxscores > 0:
- self.__maxscores = maxscores
- else:
- self.__maxscores = 10
- if isinstance(verbose, bool):
- self.__verbose = verbose
- else:
- self.__verbose = False
- self.__fieldNames = ['Score', 'Name', 'Created']
- self.__properlyLoaded = False
- self.__data = []
- self.__entries = 0
- if self.__csv_file is not None:
- try:
- with open(self.__csv_file, 'r') as csvfile:
- csvreader = csv.reader(csvfile)
- header = next(csvreader, None)
- if self.__verbose:
- print("HighScoreCSV#init: HEADER>>>>>", header)
- if header != self.__fieldNames:
- print("HighScoreCSV: ERROR: wrong header detected")
- # we don't know the CSV file format so we don't read the file
- else:
- for row in csvreader:
- if self.__verbose:
- print("HighScoreCSV#init:>>>>>", str(row[0]) + ',' + row[1] + ',' + row[2])
- self.__entries = self.__entries + 1
- self.__data.append(row)
- except Exception as e:
- print(e)
- else:
- self.__properlyLoaded = True
- if len(self.__data) > self.__maxscores:
- if self.__verbose:
- print("HighScoreCSV#init: >>>>>truncate highscore list")
- self.__data = self.__data[:self.__maxscores]
- self.__entries = self.__maxscores
- def __str__(self):
- """
- string representation of this instance
- """
- return "HighScoreCSV:[csv_file:" + self.__csv_file + "|maxscores:" + str(self.__maxscores) + "|verbose:" + str(self.__verbose) + "]"
- @property
- def is_properly_loaded(self):
- return self.__properlyLoaded
- @property
- def csv_file(self):
- return self.__csv_file
- @property
- def entries(self):
- return self.__entries
- @property
- def maxscores(self):
- return self.__maxscores
- @property
- def verbose(self):
- return self.__verbose
- def add_score(self, score, name):
- """
- add a new entry to the highscore list
- """
- idx = 0
- for row in self.__data:
- if score <= int(row[0]):
- idx = idx + 1
- continue
- break
- if self.__verbose:
- print('HighScoreCSV#add_score: >>>>>idx', ':', idx)
- if idx < self.__maxscores:
- row = [score, name]
- now = datetime.now()
- dt_string = now.strftime("%Y-%m-%dT%H:%M:%S%Z")
- row.append(dt_string)
- self.__data.insert(idx, row)
- if self.__verbose:
- print("HighScoreCSV#add_score: >>>>>row added at idx:", idx)
- self.__entries = self.__entries + 1
- if len(self.__data) > self.__maxscores:
- if self.__verbose:
- print("HighScoreCSV#add_score: >>>>>truncate highscore list")
- self.__data = self.__data[:self.__maxscores]
- self.__entries = self.__entries - 1
- if self.__verbose:
- print("HighScoreCSV#add_score: dump highscore data:")
- print(self.__data)
- return True
- if self.__verbose:
- print("HighScoreCSV#add_score: no row added")
- return False
- def print_scores(self):
- """
- print the content of the highscore list
- """
- for row in self.__data:
- print(str(row[0]) + ',' + row[1] + ',' + row[2])
- def save(self, new_csv_file=None):
- """
- save the the highscore list
- """
- store_file = None
- if isinstance(new_csv_file, str):
- store_file = new_csv_file
- else:
- store_file = self.__csv_file
- if store_file is None:
- if self.__verbose:
- print("HighScoreCSV#save: store file name not available")
- return False
- try:
- with open(store_file, 'w') as csvfile:
- csvwriter = csv.writer(csvfile, dialect='unix', quoting=csv.QUOTE_MINIMAL)
- csvwriter.writerow(self.__fieldNames)
- for row in self.__data:
- csvwriter.writerow(row)
- except Exception as e:
- print("HighScoreCSV#save: ERROR:", e)
- return False
- return True
- if __name__ == '__main__':
- hs = HighScoreCSV("./highscore.csv")
- # hs = HighScoreCSV("./highscore.csv", verbose=True)
- print('csv_file ', ':', hs.csv_file)
- print('verbose ', ':', hs.verbose)
- print('maxscores ', ':', hs.maxscores)
- print('entries ', ':', hs.entries)
- print('properly loaded ', ':', hs.is_properly_loaded)
- print("")
- hs.add_score(1, "Player1")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player2")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player3")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player4")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player5")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player6")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player7")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player8")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player9")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player10")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player11")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player12")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player13")
- print('entries ', ':', hs.entries)
- hs.add_score(1, "Player14")
- print('entries ', ':', hs.entries)
- hs.add_score(3, "Player15")
- print('entries ', ':', hs.entries)
- print("----------")
- print("Highscore list:")
- hs.print_scores()
- print("----------")
- hs.save()
- # hs.save(new_csv_file='highscore2.csv')
Advertisement
Add Comment
Please, Sign In to add comment