感觉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)
start
和end
参数是要打印的第一行和最后一行的索引。
索引值有点像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)