python如何以表格形式打印输出

好久不见,风水轮流转,我竟然写写写python

最近,有一个小需求,要求将一些信息收集上报,并直接在后台控制台打印并写入日志。

[En]

Recently, there is a small demand that some information should be collected and reported, and printed directly in the background console and written to the log.

为了美观,需要以表格形式展现数据,形如

python如何以表格形式打印输出

虽说可以用 prettytable 实现这个效果,不过还得安装这个库,需求比较简单就不考虑安装第三方依赖了,所以得自己写

照着这个图,可以发现 几个关键的实现点

  1. 由数据项的各个属性,整理出表头

  2. 计算每个属性对应的最大宽度,作为每列的宽度

  3. 每列左右留一些空

  4. 表头上下,以及数据项末尾添加一行 –+– 外围

  5. 循环每项,各项左右使用 | 做外围

  6. 需支持居中显示或左对齐,这些可以通过计算列的总长度,再补空格来实现 利用 .center .ljust 这些快捷方法

最终效果呢,还是阔以的

python如何以表格形式打印输出
1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3
 4 import time
 5 import json
 6
 7 # 数据项
 8 timingInfo = [{
 9     'url': 'https://aaa.bbb.net/ccc/article/details/11',
10     'duration(ms)': 121.12,
11     'start(ms)': 222,
12     'type': 'html',
13     'size(kb)': 22.01
14 }, {
15     'url': '/nd-element-in-list-to-another-list-of-strings',
16     'duration(ms)': 121.22,
17     'start(ms)': 3332,
18     'type': 'css',
19     'size(kb)': 22.01
20 }, {
21     'url': '/path2',
22     'duration(ms)': '121.12434234 (1212312.12 + 121212)',
23     'start(ms)': 3332,
24     'type': 'css',
25     'size(kb)': 22.01
26 }, {
27     'url': '/nd-element-in-list-to-another-list-of-strings',
28     'duration(ms)': 121.42323423423,
29     'start(ms)': 3332,
30     'type': 'css',
31     'size(kb)': 22.01
32 }, {
33     'url': 'path2',
34     'duration(ms)': '121.11 (111.11 + 20)',
35     'start(ms)': 3332,
36     'type': 'css',
37     'size(kb)': 22.01
38 }]
39
40 # 提取表头
41 keyHeader = timingInfo[0].keys()
42 # 存放每列的最大长度
43 keyMaxLen = {}
44
45 for item in timingInfo:
46     for i,h in enumerate(keyHeader):
47         # 计算每个属性对应的最大长度
48         maxLen = max(len(h), len(str(item[h])))
49         if keyMaxLen.get(h, None):
50             maxLen = max(maxLen, keyMaxLen[h])
51         keyMaxLen[h] = maxLen
52
53 print keyMaxLen
54
55 #
56 def printGroup(group):
57     for item in group:
58         print '\r'
59         for i,h in enumerate(keyHeader):
60             itemLen = keyMaxLen.get(h, str(h)) + 4
61             # 补空位并居中
62             s = str(item[h]).center(itemLen, '-' if item[h] == '-' else ' ')
63
64             icon = '|'
65             if item[h] == '-':
66                 icon = '+'
67
68             s = (icon if i == 0 else '') + s[1:len(s)] + icon
69             print s,
70
71     print '\r'
72
73 print '\n[timing info]'
74
75 # 占位项
76 tag = {}
77 for i,h in enumerate(keyHeader):
78     tag[h] = '-'
79 # 前后添上
80 timingInfo.insert(0, tag)
81 timingInfo.append(tag)
82
83 # 第一行需要先单独打印出来
84 printGroup([tag])
85
86 # 再单独打印表头
87 for i,h in enumerate(keyHeader):
88     # 留空位4
89     itemLen = keyMaxLen.get(h, str(h)) + 4
90     # 快捷居中并补空位  左对齐可使用 ljust之类
91     s = h.center(itemLen)
92     s = ('|' if i == 0 else '') + s[1:len(s)] + '|'
93     print s,
94
95 # 打印后面的数据项,包括两条 --+--占位
96 printGroup(timingInfo)

上面这个是直接打印出来的,print 默认一行打印,要做到按项拼接,就得在print后面加个逗号,

此外,这只能在控制台上输出,但如果要打印到日志,则必须以不同的方式进行。

[En]

In addition, this can only be output on the console, but if you want to print to the log, you have to do it differently.

使用字符串拼接,整个输出就是一个字符串,从头拼到末尾就ok了

当然嫌麻烦的话,也可以直接装了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)

Original: https://www.cnblogs.com/imwtr/p/11062308.html
Author: -渔人码头-
Title: python如何以表格形式打印输出

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/10644/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总