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