mirror of
				https://github.com/KevinMidboe/tableprint.git
				synced 2025-10-29 18:00:16 +00:00 
			
		
		
		
	initial commit, functions to print table (and generate header and row ASCII strings)
This commit is contained in:
		
							
								
								
									
										175
									
								
								tableprint.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								tableprint.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| """ | ||||
| Module to nicely format ASCII table rows for display | ||||
|  | ||||
| """ | ||||
|  | ||||
| # exports | ||||
| __all__ = ['table', 'row', 'header'] | ||||
|  | ||||
|  | ||||
| def table(data, headers, options=None): | ||||
|     """ | ||||
|     Print an ASCII table with the given data | ||||
|  | ||||
|     Parameters | ||||
|     ---------- | ||||
|     data : array_like | ||||
|         An (m x n) array containing the data to print (m rows of n columns) | ||||
|  | ||||
|     headers : list | ||||
|         A list of n strings consisting of the header of each of the n columns | ||||
|  | ||||
|     options : dict | ||||
|         A dictionary of options. Defaults: | ||||
|         { | ||||
|             'column_width'  : 10,       # the width of each column in the table | ||||
|             'outer_char'    : '|',      # the character defining the outer border of the table | ||||
|             'corner_char'   : '+',      # printed at the junctions of the table lines | ||||
|             'line_char'     : '-',      # character as part of each horizontal rule | ||||
|             'precision'     : '2f'      # precision string for formatting numbers | ||||
|         } | ||||
|  | ||||
|     """ | ||||
|  | ||||
|     # default options | ||||
|     opts = { | ||||
|         'column_width': 10, | ||||
|         'outer_char': '|', | ||||
|         'corner_char': '+', | ||||
|         'line_char': '-', | ||||
|         'precision': '2f' | ||||
|     } | ||||
|  | ||||
|     # user-specified options | ||||
|     if options: | ||||
|         opts.update(options) | ||||
|  | ||||
|     # the hr line | ||||
|     hrule = hr(len(headers), column_width=opts['column_width'], | ||||
|                corner_char=opts['corner_char'], line_char=opts['line_char']) | ||||
|  | ||||
|     # get the header string | ||||
|     headerstr = [hrule, header(headers, column_width=opts['column_width'], outer_char=opts['outer_char']), hrule] | ||||
|  | ||||
|     # parse each row | ||||
|     tablestr = headerstr + [row(d, column_width=opts['column_width'], precision=opts['precision'], | ||||
|                            outer_char=opts['outer_char']) for d in data] + [hrule] | ||||
|  | ||||
|     # print the table | ||||
|     print('\n'.join(tablestr)) | ||||
|  | ||||
|  | ||||
| def header(headers, column_width=10, outer_char='|'): | ||||
|     """ | ||||
|     Returns a formatted ASCII row of column header strings | ||||
|  | ||||
|     Parameters | ||||
|     ---------- | ||||
|     headers : list of strings | ||||
|         A list of n strings, the column headers | ||||
|  | ||||
|     column_width : int | ||||
|         The width of each column (Default: 10) | ||||
|  | ||||
|     outer_char : string | ||||
|         A character printed at the edges of each column (Default: '|') | ||||
|  | ||||
|     Returns | ||||
|     ------- | ||||
|     headerstr : string | ||||
|         A string consisting of the full header row to print | ||||
|  | ||||
|     """ | ||||
|  | ||||
|     # string formatter | ||||
|     fmt = map(lambda x: '{:<' + str(column_width) + '}', headers) | ||||
|  | ||||
|     # build the base string | ||||
|     basestr = (' %s ' % outer_char).join(fmt) | ||||
|  | ||||
|     # build the formatted str | ||||
|     headerstr = outer_char + basestr.format(*headers) + outer_char | ||||
|  | ||||
|     return headerstr | ||||
|  | ||||
|  | ||||
| def row(values, column_width=10, precision='2f', outer_char='|'): | ||||
|     """ | ||||
|     Returns a formatted ASCII row of data | ||||
|  | ||||
|     Parameters | ||||
|     ---------- | ||||
|     values : array_like | ||||
|         An iterable array of data (numbers of strings), each value is printed in a separate column | ||||
|  | ||||
|     column_width : int | ||||
|         The width of each column (Default: 10) | ||||
|  | ||||
|     precision : string | ||||
|         The precision format string used to format numbers in the values array (Default: '2f') | ||||
|  | ||||
|     outer_char : string | ||||
|         A character printed at the edges of each column (Default : '|') | ||||
|  | ||||
|     Returns | ||||
|     ------- | ||||
|     rowstr : string | ||||
|         A string consisting of the full row of data to print | ||||
|  | ||||
|     """ | ||||
|  | ||||
|     # mapping function for string formatting | ||||
|     def mapdata(d): | ||||
|  | ||||
|         if isinstance(d, str): | ||||
|             return ('{:>%i}' % column_width).format(d) | ||||
|  | ||||
|         elif isinstance(d, (int, float)): | ||||
|             return ('{:>%i.%s}' % (column_width, precision)).format(d) | ||||
|  | ||||
|         else: | ||||
|             raise ValueError('Elements in the values array must be strings, ints, or floats') | ||||
|  | ||||
|     # string formatter | ||||
|     fmt = map(mapdata, values) | ||||
|  | ||||
|     # build the base string | ||||
|     basestr = (' %s ' % outer_char).join(fmt) | ||||
|  | ||||
|     # build the formatted string | ||||
|     rowstr = outer_char + basestr + outer_char | ||||
|  | ||||
|     return rowstr | ||||
|  | ||||
|  | ||||
| def hr(ncols, column_width=10, corner_char='+', line_char='-', outer_char='|'): | ||||
|     """ | ||||
|     Returns a formatted string used as a border between table rows | ||||
|  | ||||
|     Parameters | ||||
|     ---------- | ||||
|     ncols : int | ||||
|         The number of columns in the table | ||||
|  | ||||
|     column_width : int | ||||
|         The width of each column (Default: 10) | ||||
|  | ||||
|     corner_char : string | ||||
|         A character printed at the intersection of column edges and the row border (Default: '+') | ||||
|  | ||||
|     line_char : string | ||||
|         A character printed in between column edges, defines the row border (Default: '-') | ||||
|  | ||||
|     outer_char : string | ||||
|         A character printed at the left and right outer edge of the row (Default: '|') | ||||
|  | ||||
|     Returns | ||||
|     ------- | ||||
|     rowstr : string | ||||
|         A string consisting of the row border to print | ||||
|  | ||||
|     """ | ||||
|  | ||||
|     hrstr = corner_char.join([('{:%s^%i}' % (line_char, column_width+2)).format('') for _ in range(ncols)]) | ||||
|  | ||||
|     return outer_char + hrstr[1:-1] + outer_char | ||||
		Reference in New Issue
	
	Block a user