使用Python原生print()将打印内容以表格形式输出

这是我自己使用 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()
 

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值