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