[home] [projects] [knowledge base] [manpages] [code] [markdown] [my ip]

Рисование таблиц в терминале

Кажется, что самый популярный инструмент для вывода данных в табличном виде на Python это пакет prettytable. Мне совсем не хотелось тащить в проект очередную зависимость, поэтому я написал простой класс, который позволяет делать то же самое, но немного попроще.

class Table:
    """Print table. Example::

        t = Table()
        t.header(['KEY', 'VALUE'])  # header is optional
        t.row(['key 1', 'value 1'])
        t.row(['key 2', 'value 2'])
        t.rows(
            [
                ['key 3', 'value 3'],
                ['key 4', 'value 4']
            ]
        )
        t.print()

    """

    def __init__(self, whitespace: str = '\t'):
        self.__rows = []
        self.__whitespace = whitespace

    def header(self, columns: list):
        self.__rows.insert(0, [str(col) for col in columns])

    def row(self, row: list):
        self.__rows.append([str(col) for col in row])

    def rows(self, rows: list):
        for row in rows:
            self.row(row)

    def print(self):
        widths = [max(map(len, col)) for col in zip(*self.__rows)]
        for row in self.__rows:
            print(self.__whitespace.join(
                (val.ljust(width) for val, width in zip(row, widths))))

Пример использвоания описан в докстринге класса Table, поэтому просто покажу каким может быть результат, на примере из документации PrettyTable:

CITY NAME   AREA    POPULATION      ANNUAL RAINFALL
Adelaide    1295    1158259         600.5
Brisbane    5905    1857594         1146.4
Darwin      112     120900          1714.7
Hobart      1357    205556          619.5
Sydney      2058    4336374         1214.8
Melbourne   1566    3806092         646.9
Perth       5386    1554769         869.4

Большего для вывода в терминал на самом деле и не нужно. Такую табилцу очень легко распарсить в отличие от таблиц с обводкой. При необходимости класс можно расширить дополнительными методами.