使用Python库的tabulate模块将对象属性的属性名和属性值以表格的形式打印
之前一次理论仿真用的是MATLAB,对于类和对象其实没有那么在意过。在经受MATLAB的卡顿闪退的折磨过后,决定新的一次仿真使用Python重新搭建环境。
第一部分涉及到Python的面对对象的代码,类的编写如下,类中的细节就不写出来了,属性已标出。
class Task(object):
def __init__(self,dataSize,priority,value,frequencyLocal,timeLocal,energyLocal,frequencyMEC,timeMEC,energyMEC,timeTransmit,energyTransmit,ifOffload):
因为没有MATLAB的表格功能的加持,如果我想查看对象的具体属性值的话,Python常规输出操作只能把数据挤在一起输出,对象多了很容易让人崩溃,所以搜索了一下可以打印表格的模块,找到了tabulate。
使用该模块需要导入或者直接导入tabulate函数
import tabulate
#或者
from tabulate import tabulate
tabulate函数的基本使用语法如下:
tabulate.tabulate(tabular_data, headers=(), tablefmt=u'simple')
tabular_data:需要打印在表格中的数据。
headers:表头
tablefmt:显示格式,其中显示格式有很多中,具体可参考这位大佬的博客
Python对齐显示||tabulate函数||wcwidth模块||知道这些就够了:
为了获取对象的属性名和属性值,我编写了如下代码:
task = Task(0,0,0,0,0,0,0,0,0,0,0,0)
Dict = task.__dict__
KEY = list(Dict.keys())
VALUE = list(Dict.values())
print(tabulate(VALUE,headers=KEY,tablefmt='pipe'))
使用__dict__将对象属性以字典的形式输出,然后分别将key和value赋值给两个列表,最后调用tabulate函数。但是VS Code报错了。
TypeError: 'int' object is not iterable
因为我的对象属性均为int型变量,所以试着改为字符串型,然后将装载属性值的列表VALUE作为一个元素装入另一个列表showdata,因为tabulate函数以逗号判断打印行数,如果直接输出VALUE,会以一列打印:
| dataSize |
|:-----------|
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
最后修改代码如下:
task = Task(0,0,0,0,0,0,0,0,0,0,0,0)
Dict = task.__dict__
KEY = list(Dict.keys())
VALUE = list(Dict.values())
VALUE = [str(x) for x in VALUE]
showdata = []
showdata.append(VALUE)
print(tabulate(showdata,headers=KEY,tablefmt='pipe',disable_numparse=True))
打印效果如下:
| dataSize | priority | value | frequencyLocal | timeLocal | energyLocal | frequencyMEC | timeMEC | energyMEC | timeTransmit | energyTransmit | ifOffload |
|:-----------|:-----------|:--------|:-----------------|:------------|:--------------|:---------------|:----------|:------------|:---------------|:-----------------|:------------|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
经过验证,将整形转为浮点型一样OK。
| dataSize | priority | value | frequencyLocal | timeLocal | energyLocal | frequencyMEC | timeMEC | energyMEC | timeTransmit | energyTransmit | ifOffload |
|:-----------|:-----------|:--------|:-----------------|:------------|:--------------|:---------------|:----------|:------------|:---------------|:-----------------|:------------|
| 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |