网站首页 > 教程文章 正文
最近在做表格输出的任务,一般有两种方法实现在控制台打印,一种是根据表格的输出规则自己写代码实现,另外一种是安装python的第三方依赖包prettytable实现这个效果。
方法1:根据表格规则写代码实现
从输出结果可以发现几个关键的实现点:
1. 由数据项的各个属性,整理出表头;
2. 计算每个属性对应的最大宽度,作为每列的宽度;
3. 每列左右留一些空;
4. 表头上下,以及数据项末尾添加一行 --+-- 外围;
5. 循环每项,各项左右使用 | 做外围;
6. 需支持居中显示或左对齐,这些可以通过计算列的总长度,再补空格来实现。
- 方法1的python2源代码如下:
#!/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)
方法1是直接打印出来的,print 默认一行打印,要做到按项拼接,就得在print后面加个逗号。这样只能在控制台输出,而如果要打印到日志中,就得换种做法,使用字符串拼接,整个输出就是一个字符串,从头拼到末尾就ok了。
方法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)
【总结】因编辑水平有限,文中难免存在个别错误或疏漏,欢迎大家留言区批评指正~~
猜你喜欢
- 2025-01-21 Python中的“锁”艺术:解锁Lock与RLock的秘密
- 2025-01-21 Python格式化字符串
- 2025-01-21 Lua实现文件I/O操作,你会吗?
- 2025-01-21 Python调用易语言动态链接库,实现验证码通杀例子
- 2025-01-21 Python语言入门源代码
- 2025-01-21 R 语言 + aardio 快速开发图形界面、生成独立 EXE
- 2025-01-21 Python中定义函数
- 2025-01-21 Python基础语法之print和变量赋值
- 2025-01-21 java程序设计练习题(二)附答案
- 2025-01-21 c#中使用miniExcel和fastreport实现付款审批单的批量打印
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)