From 50dbd9007c03f3c0557ea264706216016971d1b3 Mon Sep 17 00:00:00 2001 From: HombreLaser Date: Tue, 12 Mar 2024 11:27:28 -0600 Subject: AƱade table.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__init__.py | 0 src/exceptions.py | 3 +++ src/table.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/__init__.py create mode 100644 src/exceptions.py create mode 100644 src/table.py (limited to 'src') diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/exceptions.py b/src/exceptions.py new file mode 100644 index 0000000..1c1b058 --- /dev/null +++ b/src/exceptions.py @@ -0,0 +1,3 @@ +class IncompatibleRowLengthError(Exception): + def __init__(self, row_len: int): + super().__init__(f"Incompatible row length, got {row_len}, expected 3") \ No newline at end of file diff --git a/src/table.py b/src/table.py new file mode 100644 index 0000000..798fc9f --- /dev/null +++ b/src/table.py @@ -0,0 +1,53 @@ +import csv +from secrets import token_hex +from .exceptions import IncompatibleRowLengthError + + +ROW_SIZE = 3 + + +class Table: + def __init__(self, file_path: str): + self.csv_params = { 'delimiter': ',', 'quotechar': '"' } + self.csv_file = open(file_path, 'r+', newline='') + self.writer = csv.writer(self.csv_file, **self.csv_params) + self.rows = [tuple(row) for row in csv.reader(self.csv_file, **self.csv_params)] + + def __del__(self): + self.__write_changes() + self.csv_file.close() + + def __write_changes(self): + with open(f"new_{token_hex(8)}.csv", 'w', newline='') as new_table: + writer = csv.writer(new_table, **self.csv_params) + for row in self.rows: + writer.writerow(row) + + def row_at(self, index: int): + try: + return self.rows[index] + except IndexError: + return None + + def get_rows(self, n: int): + return self.rows[:n] + + def insert(self, new_row: tuple): + if len(new_row) != ROW_SIZE: + raise IncompatibleRowLengthError(len(new_row)) + + self.rows.append(new_row) + self.writer.writerow(new_row) + + def delete_at(self, to_delete: int): + try: + self.rows.pop(to_delete) + except IndexError: + return None + + def search(self, lookup: str): + for row in self.rows: + if lookup in row: + return row + + return None \ No newline at end of file -- cgit v1.2.3