天天看點

Python輸出表格

效果

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