使用Python原生print()实现的类似便签形式的输出

使用Python自带的print()实现的类似便签(不知道该怎么描述,描述不恰当还请见谅)的输出效果

源码

import string


class FramePrint():
    CENTER = 'center'
    RIGHT = 'right'
    LEFT = 'left'
    TOP = 'top'
    BOTTOM = 'bottom'

    def __init__(self, column=1, halign_flag='center', valign_flag='center'):
        self.__column = column
        self.__rows = []
        self.__header = []
        self.__max_len = []
        self.__max_chs_len = []
        self.__column_count = []
        self.__column_start = {}
        self.__output = []
        self.__halign_flag = halign_flag
        self.__valign_flag = valign_flag
        self.__divider_str = ''

    def set_column(self, ncol):
        self.__column = ncol

    def set_halign_flag(self, halign_flag=1):
        self.__halign_flag = halign_flag

    def set_valign_flag(self, valign_flag=1):
        self.__valign_flag = valign_flag

    def flush(self):
        self.__max_len = []
        self.__header = []
        self.__max_chs_len = []
        self.__rows = []
        self.__output = []
        self.__column = 1
        self.__divider_str = ''

    def add_row(self, row):
        if len(row) != self.__column:
            raise Exception('内容项数与列数不符')
        for index in range(len(row)):
            row[index] = str(row[index]).replace('\r\n', ' ').replace('\n', ' ')
        self.__rows.append(row)

    def add_header(self, header):
        if len(header) != self.__column:
            raise Exception('内容项数与列数不符')
        if len(self.__header) == 1:
            raise Exception('标题只能添加一次')
        for index in range(len(header)):
            self.__max_len.append(0)
            self.__max_chs_len.append(0)
            self.__header.append(str(header[index]).replace('\r\n', ' ').replace('\n', ' '))

    def __get_column_count(self):
        for index in range(len(self.__header)):
            __column_count = 0
            __column_index = []
            __column_item = {}
            for rindex in range(len(self.__rows)):
                __cell_content = ''
                row = self.__rows[rindex]
                if row[index].strip() != '':
                    __column_count += 1
                    __cell_content = row[index]
                    row[index] = ''
                    __column_index.append(__cell_content)
            __column_item[__column_count] = __column_index
            self.__column_count.append(__column_item)

    def __calc_column_start(self):
        for index in range(len(self.__column_count)):
            if self.__valign_flag == self.CENTER:
                self.__column_start[index] = int(
                    round((len(self.__rows) - list(self.__column_count[index].keys())[0]) / 2, 0))
            elif self.__valign_flag == self.TOP:
                self.__column_start[index] = 0
            elif self.__valign_flag == self.BOTTOM:
                self.__column_start[index] = len(self.__rows) - list(self.__column_count[index].keys())[0]
            else:
                raise Exception('请使用FramePrint.CENTER|FramePrint.TOP|FramePrint.BOTTOM')

    def __pre_process(self):
        for x in range(len(self.__column_count)):
            __values = list(self.__column_count[x].values())[0]
            __i = 0
            for y in range(len(self.__rows)):
                if y >= self.__column_start[x]:
                    while __i < len(__values):
                        self.__rows[y][x] = __values[__i]
                        __i += 1
                        break

    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_len_of_column(self):
        __chs_count = 0
        for index in range(len(self.__header)):
            self.__max_len[index] = max(self.__max_len[index], len(self.__header[index]))
            __chs_count = self.__get_chinese_count_in_str(self.__header[index])
            self.__max_chs_len[index] = max(self.__max_chs_len[index], __chs_count)
        for row in self.__rows:
            for index in range(len(row)):
                self.__max_len[index] = max(self.__max_len[index], len(row[index]))
                __chs_count = self.__get_chinese_count_in_str(row[index])
                self.__max_chs_len[index] = max(self.__max_chs_len[index], __chs_count)

    def __print_header(self):
        self.__output.append(self.__divider_str)
        __row_str = '|'
        for index in range(len(self.__header)):
            __cell_str = ''
            __content_len = self.__max_len[index] + 4 + self.__max_chs_len[index] - self.__get_chinese_count_in_str(
                self.__header[index])
            if self.__halign_flag == self.CENTER:
                __cell_str = self.__header[index].center(__content_len, ' ') + '|'
            elif self.__halign_flag == self.LEFT:
                __cell_str = self.__header[index].ljust(__content_len, ' ') + '|'
            elif self.__halign_flag == self.RIGHT:
                __cell_str = self.__header[index].rjust(__content_len, ' ') + '|'
            else:
                raise Exception('请使用FramePrint.CENTER|FramePrint.LEFT|FramePrint.RIGHT')
            __row_str += __cell_str
        self.__output.append(__row_str)
        self.__output.append(self.__divider_str)

    def __print_rows(self):
        for row in self.__rows:
            __row_str = '|'
            for index in range(len(row)):
                __cell_str = ''
                __content_len = self.__max_len[index] + 4 + self.__max_chs_len[index] - self.__get_chinese_count_in_str(
                    row[index])
                if self.__halign_flag == self.CENTER:
                    __cell_str = row[index].center(__content_len, ' ') + '|'
                elif self.__halign_flag == self.LEFT:
                    __cell_str = row[index].ljust(__content_len, ' ') + '|'
                elif self.__halign_flag == self.RIGHT:
                    __cell_str = row[index].rjust(__content_len, ' ') + '|'
                else:
                    raise Exception('请使用FramePrint.CENTER|FramePrint.LEFT|FramePrint.RIGHT')
                __row_str += __cell_str
            self.__output.append(__row_str)
        self.__output.append(self.__divider_str)

    def __print_divider(self):
        __divider_str = '+'
        for index in range(len(self.__max_len)):
            __divider_str += '-' * (self.__max_len[index] + 4 + self.__max_chs_len[index]) + '+'
        self.__divider_str = __divider_str

    def print(self):
        self.__get_max_len_of_column()
        self.__get_column_count()
        self.__calc_column_start()
        self.__pre_process()
        self.__print_divider()
        self.__print_header()
        self.__print_rows()
        for s in self.__output:
            print(s)

API介绍

方法参数说明
FramePrint()column列数
halign_flag水平对齐方式
valign_flag竖直对齐方式
水平和竖直对齐方式默认都是居中对齐
set_column整型设置列数
add_header()列表添加标题
add_row()列表添加数据行,没有数据的就填写空字符串''
set_valign_flag()TOP|CENTER|BOTTOM设置竖直对齐方式
set_halign_flag()LEFT|CENTER|RIGHT设置水平对齐方式
flush()刷新数据,初始化之后想要再次打印新的表格,需要使用发方法尽心刷新
print()打印最终结果

效果展示

水平对齐效果展示

左对齐

from frameprint import FramePrint
from faker import Faker

if __name__ == '__main__':
    fake = Faker(locale='zh_CN')
    frame_print = FramePrint(3, FramePrint.LEFT, FramePrint.CENTER)
    frame_print.add_header(['姓名', '地址', '邮箱'])
    frame_print.add_row([fake.name(), '', ''])
    frame_print.add_row([fake.name(), fake.address(), fake.email()])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.print()

在这里插入图片描述

居中对齐

from frameprint import FramePrint
from faker import Faker

if __name__ == '__main__':
    fake = Faker(locale='zh_CN')
    frame_print = FramePrint(3, FramePrint.CENTER, FramePrint.CENTER)
    frame_print.add_header(['姓名', '地址', '邮箱'])
    frame_print.add_row([fake.name(), '', ''])
    frame_print.add_row([fake.name(), fake.address(), fake.email()])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.print()

在这里插入图片描述

右对齐

from frameprint import FramePrint
from faker import Faker

if __name__ == '__main__':
    fake = Faker(locale='zh_CN')
    frame_print = FramePrint(3, FramePrint.RIGHT, FramePrint.CENTER)
    frame_print.add_header(['姓名', '地址', '邮箱'])
    frame_print.add_row([fake.name(), '', ''])
    frame_print.add_row([fake.name(), fake.address(), fake.email()])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.print()

在这里插入图片描述

竖直对齐效果展示

顶对齐

from frameprint import FramePrint
from faker import Faker

if __name__ == '__main__':
    fake = Faker(locale='zh_CN')
    frame_print = FramePrint(3, FramePrint.CENTER, FramePrint.TOP)
    frame_print.add_header(['姓名', '地址', '邮箱'])
    frame_print.add_row([fake.name(), '', ''])
    frame_print.add_row([fake.name(), fake.address(), fake.email()])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.print()

在这里插入图片描述

居中对齐

from frameprint import FramePrint
from faker import Faker

if __name__ == '__main__':
    fake = Faker(locale='zh_CN')
    frame_print = FramePrint(3, FramePrint.CENTER, FramePrint.CENTER)
    frame_print.add_header(['姓名', '地址', '邮箱'])
    frame_print.add_row([fake.name(), '', ''])
    frame_print.add_row([fake.name(), fake.address(), fake.email()])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.print()

在这里插入图片描述

底对齐

from frameprint import FramePrint
from faker import Faker

if __name__ == '__main__':
    fake = Faker(locale='zh_CN')
    frame_print = FramePrint(3, FramePrint.CENTER, FramePrint.BOTTOM)
    frame_print.add_header(['姓名', '地址', '邮箱'])
    frame_print.add_row([fake.name(), '', ''])
    frame_print.add_row([fake.name(), fake.address(), fake.email()])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row([fake.name(), fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.add_row(['', fake.address(), ''])
    frame_print.print()

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值