|
- class FormatError(Exception):
- pass
-
- sample = [
- ['Id', 'Nom', 'Prénom'],
- ['1', 'Tiny', 'Toon'],
- ['2', 'Wile E.', 'Coyote'],
- ['33', 'Bugs', 'Bunny'],
- ]
-
- def max_lengths(table):
- """
- retourne les largeurs maximales des colonnes d'un tableau
-
- Paramètres
- ----------
- table: list
- Le tableau constitué d'une liste (lignes) de listes
- (cellules). Les nombres de cellules pour chaque ligne
- être égaux
- Retourne
- --------
- une liste d'entiers correspondant aux largeurs maximales
- pour de chacune des colonnes du tableau
- Exemple
- -------
- >>> sample = [
- ['Id', 'Nom', 'Prénom'],
- ['1', 'Tiny', 'Toon'],
- ['2', 'Wile E.', 'Coyote'],
- ['33', 'Bugs', 'Bunny'],
- ]
- >>> max_lengths(sample)
- [2, 7, 6]
- """
- nb_lines = len(table)
- nb_columns = len(table[0])
- max_lengths = []
-
- for num_column in range(nb_columns):
- column_lengths = []
- for line in table:
- cell_content = str(line[num_column])
- column_lengths.append(len(cell_content))
- max_column_length = max(column_lengths)
- max_lengths.append(max_column_length)
- return max_lengths
-
-
- def print_cell(text, width, alignment='left', padding=' '):
- """affiche un texte dans une cellule d'une largeur définie
-
- Paramètres
- ----------
- text : str
- Le texte à afficher. Si l'argument est d'un type différent, il est
- converti en texte à l'aide de str(texte)
- width : int
- La largeur de la cellule, doit être supérieure ou égale à len(text)
- alignement : str, optionel
- L'alignement par défaut du texte dans la cellule. Les valeurs valides
- sont 'left', 'center' ou 'right'. 'left' par défaut.
- padding : str, optionel
- Le caractère à utiliser pour remplir les espaces vides de la cellule.
- L'espace est utilisé par défaut
- Returns
- -------
- None
- La fonction ne retourne rien
- Exemple
- -------
- >>> print_cell('Bob', 20, alignment='center', padding='*')
- ********Bob*********
- """
-
- # Gestion des arguments invalides
- text = str(text)
- if (not type(width) == int) or (len(text) > width) :
- raise FormatError("'width' doit être un nombre entier valant au moins " \
- "la longeur de 'text'")
- if not alignment in ['left', 'right', 'center']:
- raise FormatError("'alignment' doit être une chaîne choisie parmi " \
- "'left', 'center' ou 'right'")
- if not type(padding) == str or len(padding) != 1:
- raise FormatError("'padding' doit être une chaîne ne contenant qu'un " \
- "seul caractère")
- empty_spaces = width - len(text)
- if alignment == 'left':
- print(text + padding * empty_spaces, end="")
- elif alignment == 'center':
- left_spaces = empty_spaces // 2
- right_spaces = empty_spaces - left_spaces
- print(left_spaces*padding + text + right_spaces*padding, end="")
- else:
- print(padding*empty_spaces + text, end="")
-
-
- def print_row(cells, lengths, left_c='|', middle_c='|', right_c='|'):
- """affiche une ligne de contenu d'un tableau
-
- arguments
- ---------
- cells : list
- La liste des contenus à afficher (les cellules)
- lenghts : list
- Une liste d'entiers, les tailles respectives de chaque cellule
- à afficher
- left_c, middle_c, right_c : string (optionel)
- Chaînes d'un caractère à utiliser comme délimiteurs du tableau
- """
- nb_cells = len(cells)
- print(left_c, end="")
- for num_row in range(nb_cells):
- print_cell(cells[num_row], lengths[num_row])
- if num_row < nb_cells-1:
- print(middle_c, end='')
- print(right_c)
-
-
- def print_table(table):
- """affiche un tableau complet avec titres
-
- arguments
- ---------
- table : list
- le tableau à imprimer, sous forme d'une liste de listes,
- les lignes du tableau. La liste doit au moins comporter
- deux lignes, la liste des titres et une ligne de contenu.
- """
- lengths = max_lengths(table)
- # Bordure supérieure
- border = []
- for width in lengths:
- border.append('─' * width)
- print_row(border, lengths, left_c='╭', middle_c='┬', right_c='╮')
-
- # 1ère ligne du tableau
- for line in table[:1]:
- print_row(line, lengths)
-
- # Bordure entre titres et lignes
- border = []
- for width in lengths:
- border.append('━' * width)
- print_row(border, lengths, left_c='┝', middle_c='┿', right_c='┥')
-
- # lignes suivantes du tableau
- for line in table[1:]:
- print_row(line, lengths)
-
- # Bordure inférieure
- border = []
- for width in lengths:
- border.append('─' * width)
- print_row(border, lengths, left_c='╰', middle_c='┴', right_c='╯')
-
- # print_table(sample)
|