Python纯代码实现控制台表格打印:原理与日志适配方案

Mason
Mason
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍如何在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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表