import shutil def print_table(*, cursor=None, table=None, title=None, rows=10): """Print contents of a table or cursor. This is for quick printing of small data sets for diagnostic purposes, may not work well with large numbers of columns. Takes a sqlite3 cursor and table name as input. Output format and column widths is adjusted to fit the current console line length as needed. """ if not cursor or not table: raise ValueError("print_table requires cursor and table arguments.") if not title: title = f"{table} table" cursor.execute(f"PRAGMA table_info({table})") columns = [row[1] for row in cursor.fetchall()] # default column width is the length of each column name widths = [len(column) for column in columns] # adjust column widths based on the data found in each column cursor.execute(f"SELECT * FROM {table}") cursor_rows = cursor.fetchall() if cursor_rows: for ncol, col_width in enumerate(widths): max_data_width = max([len(str(row[ncol])) for row in cursor_rows[:rows]]) widths[ncol] = max(col_width, max_data_width) # all output lines will be truncated to console_width characters console_width = shutil.get_terminal_size((80, 20))[0] - 1 # print header rows tot_width = min(sum(widths) + len(columns) - 1, console_width) title_plus_rowcount = f"{title} ({len(cursor_rows)} rows)" print("\n" + f" {title_plus_rowcount} ".center(tot_width, "-")) column_headers = " ".join( [column.ljust(width) for column, width in zip(columns, widths)] ) print(column_headers[:console_width]) underlines = " ".join([width * "-" for width in widths]) print(underlines[:console_width]) # print data rows for row_number, row in enumerate(cursor_rows): printed_row = " ".join( [str(value).ljust(width) for value, width in zip(row, widths)] ) print(printed_row[:console_width]) if row_number >= rows - 1: break