prettytable使用

感觉prettytable 特别友好,可以输出有吸引力的ASCII格式的表格。

(参考:https://pypi.org/project/prettytable/,做了修改,更新中。。。)

举例:这两天正在奥运会,把奥运会的奖牌数输出来。

在这里插入图片描述

root@WenqiLee:~/code# cat prettytabletest.py | sed '/#/d' | sed '/#/d' | sed '/^$/d'
from prettytable import PrettyTable
table = PrettyTable()
table.field_names = ["ID", "Country", "Gold Medal","Silver Medal", "Bronze Medal", "Total Medal" ]
table.add_row([1,"中国",32,25,20,77])
table.add_row([2,"美国",30,38,36,104])
table.add_row([3,"澳大利亚",18,15,14,47])
table.add_row([4,"法国",14,19,22,55])
table.add_row([5,"英国",14,17,21,52])
print(table)

在这里插入图片描述
怎么样?还是挺美观的把~。

一. 将数据导入表格

1.1 创建一个prettytable

from prettytable import PrettyTable
table = PrettyTable()

1.2. 每次导入一行

利用 field_names属性设置表头。
利用 add_row方法添加一行。

table.field_names = ["ID", "Country", "Gold Medal","Silver Medal", "Bronze Medal", "Total Medal" ]
table.add_row([1,"中国",32,25,20,77])
table.add_row([2,"美国",30,38,36,104])
table.add_row([3,"澳大利亚",18,15,14,47])
table.add_row([4,"法国",14,19,22,55])
table.add_row([5,"英国",14,17,21,52])

print(table)

1.3. 一次导入多行

利用 add_rows方法。

table.field_names = ["ID", "Country", "Gold Medal","Silver Medal", "Bronze Medal", "Total Medal" ]

table.add_rows([
    [1,"中国",32,25,20,77],
    [2,"美国",30,38,36,104],
    [3,"澳大利亚",18,15,14,47],
    [4,"法国",14,19,22,55],
    [5,"英国",14,17,21,52],
])

print(table)

1.4. 每次导入一列

利用add_colume方法。

table.add_column("ID", [1, 2, 3, 4, 5])
table.add_column("Country",["中国","美国","澳大利亚","法国","英国"])
table.add_column("Gold Medal",[32, 30, 18, 14, 14])
table.add_column("Silver Medal",[25,38,15,19,17])
table.add_column("Bronze Medal",[ 30,36,14,22,21])
table.add_column("Total Medal", [ 77,104,47,55,52])

print(table)

1.5. 从CSV文件导入

利用from_csv模块

""" cat myfile.csv
root@WenqiLee:~/code# cat myfile.csv
ID, Country, Gold Medal,Silver Medal, Bronze Medal, Total Medal
1,中国,32,25,20,77
2,美国,30,38,36,104
3,澳大利亚,18,15,14,47
4,法国,14,19,22,55
5,英国,14,17,21,52
"""

from prettytable import from_csv
with open("myfile.csv") as fp:
    mytable = from_csv(fp)
print(mytable)

1.6. 从数据集导入

如果你的表数据位于数据库中,您可以使用符合python DB-API的库来访问它。(如使用sqlite模块访问SQLite数据库,然后你可以使用一个cursor(游标)对象来构建一个PrettyTable。
【创建数据库】

root@WenqiLee:~/code# sqlite3 mydb.db
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> CREATE TABLE Medals (
   ...> ID INTEGER PRIMARY KEY,
   ...> Country TEXT NOT NULL,
   ...> Gold_Medal INTEGER,
   ...> Silver_Medal INTEGER,
   ...> Bronze_Medal INTEGER,
   ...> Total_Medal INTEGER
   ...> );
sqlite> INSERT INTO Medals(Country, Gold_Medal, Silver_Medal, Bronze_Medal, Total_Medal) VALUES("中国", 32,25,20,77);
sqlite> INSERT INTO Medals(Country, Gold_Medal, Silver_Medal, Bronze_Medal, Total_Medal) VALUES("美国", 30,38,36,104);
sqlite> INSERT INTO Medals(Country, Gold_Medal, Silver_Medal, Bronze_Medal, Total_Medal) VALUES("澳大利亚", 18,15,14,47);
sqlite> INSERT INTO Medals(Country, Gold_Medal, Silver_Medal, Bronze_Medal, Total_Medal) VALUES("法国", 14,19,22,55);
sqlite> INSERT INTO Medals(Country, Gold_Medal, Silver_Medal, Bronze_Medal, Total_Medal) VALUES("英国", 14,17,21,52);
sqlite> SELECT * FROM Medals;
1|中国|32|25|20|77
2|美国|30|38|36|104
3|澳大利亚|18|15|14|47
4|法国|14|19|22|55
5|英国|14|17|21|52

【运行代码】

root@WenqiLee:~/code# cat test2.py
from prettytable import PrettyTable
from prettytable import from_db_cursor
import sqlite3


connection = sqlite3.connect("mydb.db")
cursor = connection.cursor()
cursor.execute("SELECT ID, Country, Gold_Medal, Silver_Medal, Bronze_Medal, Total_Medal FROM Medals")
mytable = from_db_cursor(cursor)

print(mytable)

在这里插入图片描述

1.7. 剔除数据

利用del_row方法,输入一个单行的整型索引值,来删除某行。
利用del_column方法,输入一个单列的表头名称,来删除某列。
利用clear_rows方法,无需参数,清空表中所有行,但是保留表头,你可以用相似的数据重新填充。
利用clear方法,无需参数,删除所有的行和表头,它与创建一个新的表实例不太一样,-style相关的配置会保留着。

二.用 ASCII 格式展示表格

2.1 打印

print(table)

为了传递其他选项,改变表格的外观,可以用下面的方式。

print(table.get_string())

2.2 转化为字符串(stringing)

如果你不想要以ASCII的方式输出表格,只想获取你调用print(table)时打印出来的字符串。可以用get_string方法。

my_string = table.get_string()

字符串看起来跟print(table)打印的一样,您可以做一些常规的字符串操作,比如写到文件中,或者插入到GUI中。

def my_cli_function(table format: str ='text'):
    ...
    print(table.get_formatted_string(table_format))

2.3 控制该显示什么数据

如果你喜欢,可以限制输出哪个字段(field,或者哪些表头项)。
这些方法的参数fields是:一个表头项(field)的字符串列表。

print(mytable.get_string(fields=["Country", "Gold Medal"]))
print(mytable)

在这里插入图片描述
startend参数是要打印的第一行和最后一行的索引。
索引值有点像python列表中的切片,第1行其实是第2行(第0行才是真实的第1行)。
ps:下面图片的id可能有点干扰,可以自行测试理解,跟python是一样的。

在这里插入图片描述

2.4. 改变列的对齐方式

默认列是中间对齐的。

2.4.1 一次改变所有列

你可以给align属性赋值一个字符(l,r,c,分别代表left,right,center)一次给整个表格赋值。

table.align='r'
print(table)

如下图所示
在这里插入图片描述

2.4.2 每次只改变一列

你可以将align属性视为字典,通过修改相应的字段名称(field name),修改对应列的对齐方式。

table.align["Country"] = 'l'
table.align["Gold Medal"] = 'r'
table.align["Silver Medal"] = 'r'
table.align["Bronze Medal"] = 'r'
table.align["Total Medal"] = 'c'

print(table)

在这里插入图片描述

2.5 根据某个字段排序

哈哈,这不是老美最爱干的事情吗?修改奖牌数,我不管你的金牌数,我看我的总奖牌数。

  • get_string()函数一个sortby参数,指定某个关键字,来进行排序。
  • 反向排序,添加 reversesort=True参数。
print(table.get_string(sortby="Total Medal")
# 之前用csv测过一次,紊乱了,猜测是读取的时候把整形读成字符串形了,导致识别错误,如106比54小,因为字符串1开头比5开头小)。锁着这里是用直接add_column或者add_row的方式添加的)

让我们看看这5个国家,哪个总奖牌数最少?
在这里插入图片描述
然后看谁奖牌数最多呢? (好好好,是你呀美国)

print(table.get_string(sortby="Total Medal", reversesort=True))

在这里插入图片描述
如果你总是想让表格以某种方式排序,请直接设置该表格的sortby属性。reversesort属性也同理。

table.sortby="Total Medal"
table.reversesort = True
print(table)
print(table)
print(table)

# 以上3次都输出一样(即按照总奖牌数排序),直到你给sortby赋值 None。
table.sortby=None
table.reversesort = False
table.sortby = None
print(table)

【待完成】还可以根据自定义排序规则,利用sort_key属性,给他传递一个函数。这块还没搞清楚,后面再看看。

2.6 给表格添加节(section)

给add_rows方法里面添加一个参数divider=True即可。
在这里插入图片描述
需要注意的是:如果表格排序了,那么将不会输出分隔符(divider)

三. 轻松改变表格外观

默认情况下,PrettyTable打印ASCII表格,也可以打印其他格式的表格,如果你用的是常用表格,可以用set_style方法,转其他非常用格式稍微有点麻烦。

3.1 设置表格style。

你可以在调用print(table)print(table.get_string)方法前,调用set_style方法设置表格风格。
如下面所示,将表格输出为markdown格式。

from prettytable import MARKDOWN
table.set_style(MARKDOWN)
print(table)

在这里插入图片描述
markdown格式的还是蛮美观的,适合输出。

总结:有下面这些格式。

格式介绍
DEFAULT默认格式,用于撤销之前所作的任何样式的修改。
PLAIN COLUMNS无边界样式,适用于柱状数据的命令行形式。
MSWORD_FRIENDLY一种与Microsoft Word的”转化为表格“功能完美配合的样式。
ORGMODE适合ORG格式语法的表格样式
SINGLE_BORDER 或 DOUBLE_BORDER一种连续的单/双边框线和方框图字符的样式,以便在终端上显示更精美的效果
MARKDOWN不用说了,这个很多人都用得上。

测试一下

print(">>>>>>>>>>>>>>>>>>>>>> MARKDOWN")
table.set_style(MARKDOWN)
print(table);print()

print(">>>>>>>>>>>>>>>>>>>>>> PLAIN_COLUMNS")
table.set_style(PLAIN_COLUMNS)
print(table);print()

print(">>>>>>>>>>>>>>>>>>>>>> MSWORD_FRIENDLY")
table.set_style(MSWORD_FRIENDLY)
print(table);print()

print(">>>>>>>>>>>>>>>>>>>>>> ORGMODE")
table.set_style(ORGMODE)
print(table);print()

print(">>>>>>>>>>>>>>>>>>>>>> SINGLE_BORDER")
table.set_style(SINGLE_BORDER)
print(table);print()

print(">>>>>>>>>>>>>>>>>>>>>> DOUBLE_BORDER")
table.set_style(DOUBLE_BORDER)
print(table);print()

【震惊,格式帮大家输出好了,各位客官看上那个请自取。】
在这里插入图片描述

四。改变表格的外观,hard way

呃。。。我觉得简单的已经够了,有需要再查。

参考链接:Changing the appearance of your table - the hard way

五。改变表格的外观,带颜色。

em.这个我喜欢。
PrettyTable具有使用ANSI color code打印表格的内容,包含支持通过colorama对大多数windows版本的支持。使用时导入ColorTable类,而不是PrettyTable类。

- from prettytable import PrettyTable
- from prettytable.colortable import ColorTable

ColorTable 和 PrettyTable功能一样,但是多了一个额外的属性,为你的表格装饰颜色。

from prettytable.colortable import ColorTable,Themes
...
table = ColorTable(theme=Themes.OCEAN)
print(table)

woo,海洋色的,很好看哦
在这里插入图片描述
当然还可以自定义主题内容和颜色,包括默认颜色,横向轮廓字符(vertical char,outline),纵向轮廓字符,连接点轮廓字符。横向颜色,纵向颜色,连接点颜色等等。
在这里插入图片描述

六.以json格式输出表格

prettytable也可以以json格式输出表格,格式为:一个fields列表和一个rows数组。
可以用过调用get_json_string来获取json格式的输出。

print(table.get_json_string())

在这里插入图片描述

七.以html格式输出表格

就像csv可以调用get_csv_string方法一样,html格式调用 get_html_string即可。
html格式支持:fields, start,end,sortby 和 reversesort

print(table.get_html_string)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值