使用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()