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)