Source code for pymor.tools.table

# This file is part of the pyMOR project (http://www.pymor.org).
# Copyright 2013-2020 pyMOR developers and contributors. All rights reserved.
# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)

from itertools import zip_longest
from textwrap import wrap
import numpy as np


[docs]def format_table(rows, width='AUTO', title=None): rows = [[str(c) for c in r] for r in rows] if width == 'AUTO': try: from shutil import get_terminal_size width = get_terminal_size()[0] - 1 except ImportError: width = 1000000 rows = list(rows) column_widths = [max(map(len, c)) for c in zip(*rows)] if sum(column_widths) + 2*(len(column_widths) - 1) > width: largest_column = np.argmax(column_widths) column_widths[largest_column] = 0 min_width = max(column_widths) column_widths[largest_column] = max(min_width, width - 2*(len(column_widths) - 1) - sum(column_widths)) total_width = sum(column_widths) + 2*(len(column_widths) - 1) wrapped_rows = [] for row in rows: cols = [wrap(c, width=cw) for c, cw in zip(row, column_widths)] for r in zip_longest(*cols, fillvalue=""): wrapped_rows.append(r) rows = wrapped_rows rows.insert(1, ['-' * cw for cw in column_widths]) if title is not None: separator = '=' * len(title) title = f'{title:^{total_width}}\n' \ f'{separator:^{total_width}}\n\n' else: title = '' return title + '\n'.join(' '.join(f'{c:<{cw}}' for c, cw in zip(r, column_widths)) for r in rows)