實(shí)用,5個(gè)案例讓 Python 輸出漂亮的表格!

原文鏈接:
https://linuxops.org/blog/python/prettytable.html
1. 前言
說(shuō)明:本文使用Markdown語(yǔ)法編寫,為了展示方便,以及復(fù)制方便,所以本文中沒有使用截圖,因?yàn)楦袷娇刂频膯栴},文章中的運(yùn)行結(jié)果會(huì)出現(xiàn)一些分割線的偏移,在終端中呈現(xiàn)并此問題,請(qǐng)各位手動(dòng)去操作驗(yàn)證。
2. 安裝
prettytable并非python的內(nèi)置庫(kù),通過(guò)pip install prettytable即可安裝。3. 一個(gè)小示例
我們先來(lái)看一個(gè)示例:#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
reload(sys)
sys.setdefaultencoding('utf8')
table?=?PrettyTable(['編號(hào)','云編號(hào)','名稱','IP地址'])
table.add_row(['1','server01','服務(wù)器01','172.16.0.1'])
table.add_row(['2','server02','服務(wù)器02','172.16.0.2'])
table.add_row(['3','server03','服務(wù)器03','172.16.0.3'])
table.add_row(['4','server04','服務(wù)器04','172.16.0.4'])
table.add_row(['5','server05','服務(wù)器05','172.16.0.5'])
table.add_row(['6','server06','服務(wù)器06','172.16.0.6'])
table.add_row(['7','server07','服務(wù)器07','172.16.0.7'])
table.add_row(['8','server08','服務(wù)器08','172.16.0.8'])
table.add_row(['9','server09','服務(wù)器09','172.16.0.9'])
print(table)
以上示例運(yùn)行結(jié)果如下:linuxops@deepin:~$?python?p.py?
+------+----------+----------+------------+
|?編號(hào)?|??云編號(hào)??|???名稱???|???IP地址???|
+------+----------+----------+------------+
|??1???|?server01?|?服務(wù)器01?|?172.16.0.1?|
|??2???|?server02?|?服務(wù)器02?|?172.16.0.2?|
|??3???|?server03?|?服務(wù)器03?|?172.16.0.3?|
|??4???|?server04?|?服務(wù)器04?|?172.16.0.4?|
|??5???|?server05?|?服務(wù)器05?|?172.16.0.5?|
|??6???|?server06?|?服務(wù)器06?|?172.16.0.6?|
|??7???|?server07?|?服務(wù)器07?|?172.16.0.7?|
|??8???|?server08?|?服務(wù)器08?|?172.16.0.8?|
|??9???|?server09?|?服務(wù)器09?|?172.16.0.9?|
+------+----------+----------+------------+
在以上的示例中,我們通過(guò)form導(dǎo)入了表格庫(kù)。table實(shí)例化了一個(gè)表格庫(kù),并且添加了['編號(hào)','云編號(hào)','名稱','IP地址']為表頭,如果沒有添加表頭,那么會(huì)以默認(rèn)的Field+編號(hào)顯示,例如:+---------+----------+----------+------------+
|?Field?1?|?Field?2??|?Field?3??|??Field?4???|
+---------+----------+----------+------------+
所以為更直觀看出每一列的意義,還是要添加表頭的。4. 添加數(shù)據(jù)
prettytable提供了多種的添加數(shù)據(jù)的方式,最常用的應(yīng)該就是按行按列添加數(shù)據(jù)了。A、按行添加數(shù)據(jù) table.add_row
在上面簡(jiǎn)單的示例中,我們就是按行添加數(shù)據(jù)的。添加的數(shù)據(jù)必須要是列表的形式,而且數(shù)據(jù)的列表長(zhǎng)度要和表頭的長(zhǎng)度一樣。在實(shí)際的使用中,我們應(yīng)該要關(guān)注到添加的數(shù)據(jù)是否和表頭對(duì)應(yīng),這一點(diǎn)很重要。B、按列添加數(shù)據(jù) table.add_column()
看下面的示例:#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
reload(sys)
sys.setdefaultencoding('utf8')
table?=?PrettyTable()
table.add_column('項(xiàng)目',?['編號(hào)','云編號(hào)','名稱','IP地址'])
table.add_column('值',?['1','server01','服務(wù)器01','172.16.0.1'])
print(table)
運(yùn)行結(jié)果如下:+-------+--------+------------+
|?index?|?項(xiàng)目?|????值?????|
+-------+--------+------------+
|???1???|??編號(hào)??|?????1??????|
|???2???|?云編號(hào)?|??server01??|
|???3???|??名稱??|??服務(wù)器01???|
|???4???|?IP地址?|?172.16.0.1?|
+-------+--------+------------+
以上示例中,我們通過(guò)add_column來(lái)按列添加數(shù)據(jù),按列添加數(shù)據(jù)不需要在實(shí)例化表格的時(shí)候制定表頭,它的表頭是在添加列的時(shí)候指定的。table.add_column('項(xiàng)目', ['編號(hào)','云編號(hào)','名稱','IP地址']) 這一行代碼為例,項(xiàng)目指定了這個(gè)列的表頭名為"項(xiàng)目",['編號(hào)','云編號(hào)','名稱','IP地址']為列的值,同樣為列表。C、從csv文件添加數(shù)據(jù)
PrettyTable不僅提供了手動(dòng)按行按列添加數(shù)據(jù),也支持直接從csv文件中讀取數(shù)據(jù)。#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
from?prettytable?import?from_csv?
reload(sys)
sys.setdefaultencoding('utf8')
table?=?PrettyTable()
fp?=?open("res.csv",?"r")?
table?=?from_csv(fp)?
print(table)
fp.close()
如果要讀取cvs文件數(shù)據(jù),必須要先導(dǎo)入from_csv,否則無(wú)法運(yùn)行。上面的示例運(yùn)行結(jié)果如下:+------+----------+----------+------------+
|?編號(hào)?|??云編號(hào)??|???名稱???|???IP地址???|
+------+----------+----------+------------+
|??1???|?server01?|?服務(wù)器01?|?172.16.0.1?|
|??2???|?server02?|?服務(wù)器02?|?172.16.0.2?|
|??3???|?server03?|?服務(wù)器03?|?172.16.0.3?|
|??4???|?server04?|?服務(wù)器04?|?172.16.0.4?|
|??5???|?server05?|?服務(wù)器05?|?172.16.0.5?|
|??6???|?server06?|?服務(wù)器06?|?172.16.0.6?|
|??7???|?server07?|?服務(wù)器07?|?172.16.0.7?|
|??8???|?server08?|?服務(wù)器08?|?172.16.0.8?|
|??9???|?server09?|?服務(wù)器09?|?172.16.0.9?|
+------+----------+----------+------------+
csv文件不能通過(guò)xls直接重命名得到,會(huì)報(bào)錯(cuò)。如果是xls文件,請(qǐng)用另存為csv獲得csv文件
D、從sql查詢值添加
從數(shù)據(jù)庫(kù)查詢出來(lái)的數(shù)據(jù)可以直接導(dǎo)入到表格打印,下面的例子使用了sqlite3,如果使用的是mysql也是一樣的,只要能查詢到數(shù)據(jù)就能導(dǎo)入到表格中#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
from?prettytable?import?from_db_cursor?
import?sqlite3
reload(sys)
sys.setdefaultencoding('utf8')
conn?=?sqlite3.connect("/tmp/aliyun.db")
cur?=?conn.cursor()
cur.execute("SELECT?*?FROM?res")?
table?=?from_db_cursor(cur)
print(table)
運(yùn)行結(jié)果如下:+------+----------+----------+------------+
|?編號(hào)?|??云編號(hào)??|???名稱???|???IP地址???|
+------+----------+----------+------------+
|??1???|?server01?|?服務(wù)器01?|?172.16.0.1?|
|??2???|?server02?|?服務(wù)器02?|?172.16.0.2?|
|??3???|?server03?|?服務(wù)器03?|?172.16.0.3?|
|??4???|?server04?|?服務(wù)器04?|?172.16.0.4?|
|??5???|?server05?|?服務(wù)器05?|?172.16.0.5?|
|??6???|?server06?|?服務(wù)器06?|?172.16.0.6?|
|??7???|?server07?|?服務(wù)器07?|?172.16.0.7?|
|??8???|?server08?|?服務(wù)器08?|?172.16.0.8?|
|??9???|?server09?|?服務(wù)器09?|?172.16.0.9?|
+------+----------+----------+------------+
E、從HTML導(dǎo)入數(shù)據(jù)
支持從html的表格中導(dǎo)入,請(qǐng)看下面這個(gè)例子:#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
from?prettytable?import?from_html?
reload(sys)
sys.setdefaultencoding('utf8')
html_string='''
編號(hào)
云編號(hào)
名稱
IP地址
1
server01
服務(wù)器01
172.16.0.1
2
server02
服務(wù)器02
172.16.0.2
'''
table?=?from_html(html_string)
print(table[0])
運(yùn)行結(jié)果如下:+------+----------+----------+------------+
|?編號(hào)?|??云編號(hào)??|???名稱???|???IP地址???|
+------+----------+----------+------------+
|??1???|?server01?|?服務(wù)器01?|?172.16.0.1?|
|??2???|?server02?|?服務(wù)器02?|?172.16.0.2?|
+------+----------+----------+------------+
如上示例中,我們可以導(dǎo)入html的表格,但是不一樣的地方是print語(yǔ)句,使用html表格導(dǎo)入數(shù)據(jù)的時(shí)候print的必須是列表中的第一個(gè)元素,否則有可能會(huì)報(bào)[]這樣的錯(cuò)誤。這是因?yàn)?/span>table并不是PrettyTable對(duì)象,而是包含單個(gè)PrettyTable對(duì)象的列表,它通過(guò)解析html而來(lái),所以無(wú)法直接打印table,而需要打印table[0]5. 表格輸出格式
正如支持多種輸入一樣,表格的輸出也支持多種格式,我們?cè)谏厦嬷械睦又幸呀?jīng)使用了print的方式輸出,這是一種常用的輸出方式。A、print
直接通過(guò)print打印出表格。這種方式打印出的表格會(huì)帶邊框。B、輸出HTML格式的表格
print(table.get_html_string())可以打印出html標(biāo)簽的表格。在上面的例子中,使用print(table.get_html_string())會(huì)打印出如下結(jié)果:
????
????????編號(hào)
????????云編號(hào)
????????名稱
????????IP地址
????
????
????????1
????????server01
????????服務(wù)器01
????????172.16.0.1
????
????
????????2
????????server02
????????服務(wù)器02
????????172.16.0.2
????
6. 選擇性輸出
prettytable在創(chuàng)建表格之后,你依然可以有選擇的輸出某些特定的行.A、輸出指定的列
print table.get_string(fields=["編號(hào)", "IP地址"])可以輸出指定的列B、輸出前兩行
通過(guò)print(table.get_string(start = 0, end = 2))的可以打印出指定的列,當(dāng)然start和end參數(shù)讓我可以自由控制顯示區(qū)間。當(dāng)然區(qū)間中包含start不包含end,是不是很熟悉這樣的用法?根據(jù)輸出指定行列的功能,我們可以同時(shí)指定行和列來(lái)輸出,這里就不說(shuō)明了。
C、將表格切片
從上面的輸出區(qū)間,我們做一個(gè)大膽的假設(shè),既然區(qū)間包含start不包含end這種規(guī)則和切片的一樣,我們可以不可通過(guò)切片來(lái)生成一個(gè)新的表格然后將其打印。事實(shí)上是可以的。new_table?=?table[0:2]
print(new_table)
如上代碼段中,我們就可以打印出0到1行共2行的表格,python的切片功能異常強(qiáng)大,配合切片我們可以自由的輸入任意的行。D、輸出排序
有時(shí)候我們需要對(duì)輸出的表格進(jìn)行排序,使用print table.get_string(sortby="編號(hào)", reversesort=True)就可以對(duì)表格進(jìn)行排序,其中reversesort指定了是否倒序排序,默認(rèn)為False,即默認(rèn)正序列排序。sortby指定了排序的字段。7. 表格的樣式
A、內(nèi)置樣式
通過(guò)set_style()可以設(shè)置表格樣式,prettytable內(nèi)置了多種的樣式個(gè)人覺得MSWORD_FRIENDLY,PLAIN_COLUMNS,DEFAULT 這三種樣式看起來(lái)比較清爽,在終端下顯示表格本來(lái)看起就很累,再加上一下花里胡哨的東西看起來(lái)就更累。除了以上推薦的三種樣式以外,還有一種樣式不得不說(shuō),那就是RANDOM,這是一種隨機(jī)的樣式,每一次打印都會(huì)在內(nèi)置的樣式中隨機(jī)選擇一個(gè),比較好玩。具體內(nèi)置了幾種樣式,請(qǐng)各位參考官網(wǎng)完整自己嘗試輸出看看。#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
from?prettytable?import?MSWORD_FRIENDLY
from?prettytable?import?PLAIN_COLUMNS
from?prettytable?import?RANDOM
from?prettytable?import?DEFAULT
reload(sys)
sys.setdefaultencoding('utf8')
table?=?PrettyTable(['編號(hào)','云編號(hào)','名稱','IP地址'])
table.add_row(['1','server01','服務(wù)器01','172.16.0.1'])
table.add_row(['3','server03','服務(wù)器03','172.16.0.3'])
table.add_row(['2','server02','服務(wù)器02','172.16.0.2'])
table.add_row(['9','server09','服務(wù)器09','172.16.0.9'])
table.add_row(['4','server04','服務(wù)器04','172.16.0.4'])
table.add_row(['5','server05','服務(wù)器05','172.16.0.5'])
table.add_row(['6','server06','服務(wù)器06','172.16.0.6'])
table.add_row(['8','server08','服務(wù)器08','172.16.0.8'])
table.add_row(['7','server07','服務(wù)器07','172.16.0.7'])
table.set_style(DEFAULT)
print(table)
B、自定義樣式
除了內(nèi)置的樣式以外,PrettyTable也提供了用戶自定義,例如對(duì)齊方式,數(shù)字輸出格式,邊框連接符等等C、設(shè)置對(duì)齊方式
align提供了用戶設(shè)置對(duì)齊的方式,值有l,r,c方便代表左對(duì)齊,右對(duì)齊和居中 如果不設(shè)置,默認(rèn)居中對(duì)齊。D、控制邊框樣式
在PrettyTable中,邊框由三個(gè)部分組成,橫邊框,豎邊框,和邊框連接符(橫豎交叉的鏈接符號(hào))如下示例:#!/usr/bin/python
#**coding:utf-8**
import?sys
from?prettytable?import?PrettyTable
reload(sys)
sys.setdefaultencoding('utf8')
table?=?PrettyTable(['編號(hào)','云編號(hào)','名稱','IP地址'])
table.add_row(['1','server01','服務(wù)器01','172.16.0.1'])
table.add_row(['3','server03','服務(wù)器03','172.16.0.3'])
table.add_row(['2','server02','服務(wù)器02','172.16.0.2'])
table.add_row(['9','server09','服務(wù)器09','172.16.0.9'])
table.add_row(['4','server04','服務(wù)器04','172.16.0.4'])
table.add_row(['5','server05','服務(wù)器05','172.16.0.5'])
table.add_row(['6','server06','服務(wù)器06','172.16.0.6'])
table.add_row(['8','server08','服務(wù)器08','172.16.0.8'])
table.add_row(['7','server07','服務(wù)器07','172.16.0.7'])
table.align[1]?=?'l'
table.border?=?True
table.junction_char='$'
table.horizontal_char?=?'+'
table.vertical_char?=?'%'
print(table)
table.border`控制是否顯示邊框,默認(rèn)是`True
table.junction_char控制邊框連接符table.horizontal_char控制橫邊框符號(hào)table.vertical_char控制豎邊框符號(hào)上例運(yùn)行如下:$++++++$++++++++++$++++++++++$++++++++++++$
%?編號(hào)?%??云編號(hào)??%???名稱???%???IP地址???%
$++++++$++++++++++$++++++++++$++++++++++++$
%??1???%?server01?%?服務(wù)器01?%?172.16.0.1?%
%??3???%?server03?%?服務(wù)器03?%?172.16.0.3?%
%??2???%?server02?%?服務(wù)器02?%?172.16.0.2?%
%??9???%?server09?%?服務(wù)器09?%?172.16.0.9?%
%??4???%?server04?%?服務(wù)器04?%?172.16.0.4?%
%??5???%?server05?%?服務(wù)器05?%?172.16.0.5?%
%??6???%?server06?%?服務(wù)器06?%?172.16.0.6?%
%??8???%?server08?%?服務(wù)器08?%?172.16.0.8?%
%??7???%?server07?%?服務(wù)器07?%?172.16.0.7?%
$++++++$++++++++++$++++++++++$++++++++++++$
以上簡(jiǎn)單介紹了表格常用的一些樣式設(shè)置,具體的請(qǐng)參考官方網(wǎng)站。評(píng)論
圖片
表情
