14
|
1 """
|
|
2 formatting tools for tabular data
|
|
3 """
|
|
4
|
|
5 __all__ = ['format_cols', 'format_table']
|
|
6
|
|
7 def format_cols(rows, header=None, right_align=()):
|
|
8 if not rows:
|
|
9 return []
|
|
10 if isinstance(rows[0], dict):
|
|
11 header = header or rows[0].keys()
|
|
12 rows = [[row[h] for h in header] for row in rows]
|
|
13 if header:
|
|
14 rows.insert(0, header)
|
|
15 rows.insert(1, ['-'*len(i) for i in header])
|
|
16 assert len(set([len(row) for row in rows])) == 1
|
|
17 rows = [[str(col).strip() for col in row]
|
|
18 for row in rows]
|
|
19 lengths = [max([len(row[i]) for row in rows])
|
|
20 for i in range(len(rows[0]))]
|
|
21 rows = [[(' '*(length-len(col)) + col) if index in right_align else (col + ' '*(length-len(col)))
|
|
22 for index, (col, length) in enumerate(zip(row, lengths))]
|
|
23 for row in rows]
|
|
24 return rows
|
|
25
|
|
26 def format_table(rows, header=None, right_align=(), joiner=' '):
|
|
27 """format a table for printing"""
|
|
28 rows = format_cols(rows, header=header, right_align=right_align)
|
|
29 return '\n'.join([joiner.join([str(col) for col in row]).rstrip() for row in rows])
|