Python纯代码实现控制台表格打印:原理与日志适配方案
本文介绍如何在Python中不依赖第三方库,通过纯代码实现控制台表格的美观打印。详细解析了提取表头、计算列宽、对齐方式及分隔线生成的核心逻辑,并提供了完整的代码示例。此外,还探讨了将表格输出适配到日志系统的方法,包括使用print逗号拼接和字符串整体拼接两种方案,帮助开发者灵活处理数据展示需求。
Python纯代码实现控制台表格打印:原理与日志适配方案
许久未更新,如今我也开始涉足Python开发了。
最近遇到一个小需求,需要收集并统计部分信息,要求直接在后台控制台打印显示,同时写入日志文件。
为了提升视觉效果,数据需要以表格形式呈现,大致效果如下:

虽然可以使用prettytable库轻松实现该效果,但由于需求较为简单,为避免引入第三方依赖,决定自行编写代码实现。
表格生成的核心逻辑
观察上述示例图,可以提炼出几个关键的实现要点:
首先,根据数据项的各个属性字段,整理出表格的表头信息。
其次,计算每个属性字段内容的最大字符宽度,以此作为对应列的固定宽度。
接着,在每一列内容的左右两侧预留一定的空白间距,以增强可读性。
然后,在表头上方以及数据项末尾添加由--和+组成的分隔线作为表格外围边框。
随后,遍历每一项数据,在各项内容的左右两侧使用|符号进行包裹。
最后,需支持居中显示或左对齐功能,这可以通过计算列的总长度并补充空格来实现,利用.center或.ljust等字符串快捷方法即可处理。
最终生成的表格效果看起来还是不错的。

代码实现示例
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import json
# 数据项
timingInfo = [{
'url': 'https://aaa.bbb.net/ccc/article/details/11',
'duration(ms)': 121.12,
'start(ms)': 222,
'type': 'html',
'size(kb)': 22.01
}, {
'url': '/nd-element-in-list-to-another-list-of-strings',
'duration(ms)': 121.22,
'start(ms)': 3332,
'type': 'css',
'size(kb)': 22.01
}, {
'url': '/path2',
'duration(ms)': '121.12434234 (1212312.12 + 121212)',
'start(ms)': 3332,
'type': 'css',
'size(kb)': 22.01
}, {
'url': '/nd-element-in-list-to-another-list-of-strings',
'duration(ms)': 121.42323423423,
'start(ms)': 3332,
'type': 'css',
'size(kb)': 22.01
}, {
'url': 'path2',
'duration(ms)': '121.11 (111.11 + 20)',
'start(ms)': 3332,
'type': 'css',
'size(kb)': 22.01
}]
# 提取表头
keyHeader = timingInfo[0].keys()
# 存放每列的最大长度
keyMaxLen = {}
for item in timingInfo:
for i,h in enumerate(keyHeader):
# 计算每个属性对应的最大长度
maxLen = max(len(h), len(str(item[h])))
if keyMaxLen.get(h, None):
maxLen = max(maxLen, keyMaxLen[h])
keyMaxLen[h] = maxLen
print keyMaxLen
#
def printGroup(group):
for item in group:
print '\r'
for i,h in enumerate(keyHeader):
itemLen = keyMaxLen.get(h, str(h)) + 4
# 补空位并居中
s = str(item[h]).center(itemLen, '-' if item[h] == '-' else ' ')
icon = '|'
if item[h] == '-':
icon = '+'
s = (icon if i == 0 else '') + s[1:len(s)] + icon
print s,
print '\r'
print '\n[timing info]'
# 占位项
tag = {}
for i,h in enumerate(keyHeader):
tag[h] = '-'
# 前后添上
timingInfo.insert(0, tag)
timingInfo.append(tag)
# 第一行需要先单独打印出来
printGroup([tag])
# 再单独打印表头
for i,h in enumerate(keyHeader):
# 留空位4
itemLen = keyMaxLen.get(h, str(h)) + 4
# 快捷居中并补空位 左对齐可使用 ljust之类
s = h.center(itemLen)
s = ('|' if i == 0 else '') + s[1:len(s)] + '|'
print s,
# 打印后面的数据项,包括两条 --+--占位
printGroup(timingInfo)
控制台输出与日志适配技巧
上述示例是直接打印输出的结果。由于print默认换行打印,若要在同一行内按项拼接输出,需要在print语句后添加逗号(Python 2语法)或使用其他拼接方式。
另外,这种方式仅适用于控制台直接输出。如果希望将表格内容打印到日志文件中,则需要采用不同的处理策略。
可以通过字符串拼接的方式,将整个表格构建为一个完整的字符串,从头拼接至末尾即可实现。
当然,如果不想自行处理细节,直接安装并调用prettytable库也是可行的替代方案。
第三方库替代方案
import prettytable as pt
# tb = pt.PrettyTable( ["City name", "Area", "Population", "Annual Rainfall"])
tb = pt.PrettyTable()
tb.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
tb.add_row(["Adelaide",1295, 1158259, 600.5])
tb.add_row(["Brifasdfae",5905, 1857594, 1146.4])
tb.add_row(["Darwin", 112, 120900, 171423423423423424.7])
tb.add_row(["Hobart", 1357, 205556,619.5])
print(tb)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













