Python输出表格

效果

在这里插入图片描述

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time: 2020/3/18 16:15
# @Author: Luo.Chris

from time import sleep

# 单元格类
class Cell:
    def __init__(self, data={}):
        if "text" in data:
            self.text = data["text"]
        else:
            self.text = ""
        if "length" in data:
            self.length = data["length"]
        else:
            self.length = 0
        if "color" in data:
            self.color = data["color"]
        else:
            self.color = ""

# 表格类
class Grid:
    # 表头数据
    head = []
    # 保存所有行数据
    lines = []

    # 初始化表头
    def __init__(self, headData):
        self.head = self.initialLineData(headData)

    # 初始化一行数据
    def initialLineData(self, columns):
        line = []
        if self.head == []:
            tmp = columns
        else:
            tmp = self.head
        for i in range(len(tmp)):
            if len(columns) - 1 >= i:
                line.append(Cell(columns[i]))
            else:
                line.append(Cell())
        return line

    # 新增一行数据
    def addLine(self, columns):
        self.lines.append(self.initialLineData(columns))

    # 输出行基本方法
    def buildLine(self, start, default_Fill, split, end, line=None):
        tempStr = ""
        for i in range(len(self.head)):
            if line:
                pttren = "{}{:<" + str(self.head[i].length * 1) + "}"+ "\033[0m"
                if line[i]:
                    fill = pttren.format(line[i].color, " " + line[i].text + " " )
                else:
                    fill = pttren.format("")
            else:
                fill = default_Fill * self.head[i].length
            tempStr = tempStr + fill
            if i < len(self.head) - 1:
                tempStr = tempStr + split
        return start + tempStr + end
        # else: return "\033[22,37m" + start + tempStr + end + "\33[0m"

    # 按类型输出行
    def buildTypeLine(self, type, line=None):
        if type == "top":
            return self.buildLine("┌", "─", "┬", "┐")
        elif type == "content":
            return self.buildLine("│", "─", "│", "│", line)
        elif type == "split":
            return self.buildLine("├", "─", "┼", "┤")
        elif type == "bottom":
            return self.buildLine("└", "─", "┴", "┘")
        else:
            return ""

    # 输出整个表格
    def buildAll(self):
        result = self.buildTypeLine("top")
        result = result + "\n" + self.buildTypeLine("content", self.head)
        if len(self.lines) == 0:
            result = result + "\n" + self.buildTypeLine("bottom")
        else:
            result = result + "\n" + self.buildTypeLine("split")
            # 生成行
            for i in range(len(self.lines)):
                result = result + "\n" + self.buildTypeLine("content", self.lines[i])
                if i >= len(self.lines) - 1:
                    result = result + "\n" + self.buildTypeLine("bottom")
                else:
                    result = result + "\n" + self.buildTypeLine("split")
        return result

if __name__ == '__main__':
    # 表头,需要配置长度
    headColumn = [{"text": "name", "length": 14, "color": "\033[1;36m"},
                  {"text": "file", "length": 40, "color": "\033[1;36m"},
                  {"text": "port", "length": 8, "color": "\033[1;36m"},
                  {"text": "status", "length": 10, "color": "\033[1;36m"},
                  {"text": "description", "length": 50, "color": "\033[1;36m"}
                  ]
    grid = Grid(headColumn)

    #添加一行数据
    grid.addLine([{"text": "user"},
                  {"text": "microservice-user.jar"},
                  {"text": "8000"},
                  {"text": "running", "color": "\033[1;32m"},
                  {"text": "-"}
                  ])

    print(grid.buildAll())
    #光标回到顶行, 下次覆盖输出实现刷新数据效果,此效果支持Xshell,在某些程序(如Putty)无效。
    print("\033[" + str(len(grid.lines) * 2 + 4) + "A")
    sleep(3)
    #动态修改一行数据
    grid.lines[0][3].text = 'stopped'
    grid.lines[0][3].color = "\033[1;31m"
    print(grid.buildAll())

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值