这是我自己使用 Python 原生 print 函数写的一个用来将内容以表格的形式进行格式化输出的模块
源码
import string
class TablePrint:
CENTER = 'center'
RIGHT = 'right'
LEFT = 'left'
def __init__(self, align_flag='center'):
self.__headers = []
self.__rows = []
self.__max_len = {} # 记录每一列的最大长度
self.__max_chinese_len = {}
self.__divider_str = ''
self.__output_table = []
self.__align_flag = align_flag
def set_align_flag(self, align_flag):
self.__align_flag = align_flag
def add_row(self, row):
for i in range(len(row)):
row[i] = str(row[i]).replace('\r\n', ' ').replace('\n', ' ')
self.__rows.append(row)
def add_header(self, headers):
if len(self.__headers) == 1:
raise Exception('只能添加一行表头')
for header in headers:
self.__headers.append(str(header).replace('\r\n', ' ').replace('\n', ' '))
def flush(self):
self.__headers = []
self.__rows = []
self.__max_len = {}
self.__max_chinese_len = {}
self.__output_table = []
self.__divider_str = ''
def __get_chinese_count_in_str(self, s):
__count = 0
for c in str(s):
if c.isalpha() and c not in string.ascii_letters:
__count += 1
return __count
def __get_max_length_of_column(self):
if len(self.__headers) == 0:
raise Exception('请添加表头')
elif len(self.__rows) == 0:
raise Exception('请添加内容')
for i in range(len(self.__headers)):
chs_count = self.__get_chinese_count_in_str(self.__headers[i])
self.__max_chinese_len[i] = max(self.__max_chinese_len.get(i, 0), chs_count)
self.__max_len[i] = max(self.__max_len.get(i, 0), len(str(self.__headers[i])))
for row in self.__rows:
for index in range(len(row)):
chs_count = self.__get_chinese_count_in_str(row[index])
self.__max_chinese_len[index] = max(self.__max_chinese_len.get(index, 0), chs_count)
self.__max_len[index] = max(self.__max_len.get(index, 0), len(str(row[index])))
def __print_rows(self):
for row in self.__rows:
if len(row) != len(self.__headers):
raise Exception('表头和内容项数不匹配')
row_str = '|'
for index in range(len(row)):
chs_count = self.__get_chinese_count_in_str(row[index])
cell_str = ''
__content_length = self.__max_len[index] + 4 + self.__max_chinese_len[index] - chs_count
# 补齐空位并居中
if self.__align_flag == self.CENTER:
cell_str += str(row[index]).center(__content_length, ' ') + '|'
elif self.__align_flag == self.LEFT:
cell_str += str(row[index]).ljust(__content_length, ' ') + '|'
elif self.__align_flag == self.RIGHT:
cell_str += str(row[index]).rjust(__content_length, ' ') + '|'
else:
raise Exception('请使用TablePrint.CENTER|TablePrint.LEFT|TablePrint.RIGHT')
row_str += cell_str
self.__output_table.append(row_str)
self.__output_table.append(self.__divider_str)
def __print_divider(self):
divider_str = '+'
for i in range(len(self.__headers)):
divider_str += '-' * (self.__max_len[i] + 4 + self.__max_chinese_len[i]) + '+'
self.__divider_str = divider_str
def __print_header(self):
row_str = '|'
for index in range(len(self.__headers)):
chs_count = self.__get_chinese_count_in_str(self.__headers[index])
cell_str = ''
content_len = self.__max_len[index] + 4 + self.__max_chinese_len[index] - chs_count
if self.__align_flag == self.CENTER:
cell_str += str(self.__headers[index]).center(content_len) + '|'
elif self.__align_flag == self.LEFT:
cell_str += str(self.__headers[index]).ljust(content_len) + '|'
elif self.__align_flag == self.RIGHT:
cell_str += str(self.__headers[index]).rjust(content_len) + '|'
else:
raise Exception('请使用TablePrint.CENTER|TablePrint.LEFT|TablePrint.RIGHT')
row_str += cell_str
self.__output_table.append(self.__divider_str)
self.__output_table.append(row_str)
self.__output_table.append(self.__divider_str)
def print(self):
self.__get_max_length_of_column()
self.__print_divider()
self.__print_header()
self.__print_rows()
for row in self.__output_table:
print(row)
API介绍
方法 | 参数 | 说明 |
---|---|---|
flush() | 无 | 初始化之后,如果想要再次打印新的内容,可以使用该方法清除之前的数据 |
add_header() | 列表 | 添加表头内容 |
add_row() | 列表 | 添加每一行的内容 |
set_align_flag() | CENTER|LEFT|RIGHT | 定义单元格内容的对齐方式(居中|左对齐|右对齐),在类初始化的默认对齐方式是居中对齐 |
print() | 无 | 将添加的表头和内容以表格形式进行输出 |
效果展示
输出中文
from tableprint import TablePrint
from faker import Faker
if __name__ == '__main__':
fake = Faker(locale='zh_CN')
table_print = TablePrint()
table_print.add_header(['姓名', '住址', '邮箱'])
for _ in range(1, 11):
table_print.add_row([fake.name(), fake.address(), fake.email()])
table_print.print()
输出英文
from tableprint import TablePrint
from faker import Faker
if __name__ == '__main__':
fake = Faker()
table_print = TablePrint(TablePrint.RIGHT)
table_print.add_header(['name', 'address', 'email'])
for _ in range(1, 11):
table_print.add_row([fake.name(), fake.address(), fake.email()])
table_print.print()