Python利用prettytable庫(kù)輸出好看的表格
1.前言
最近在用 Python 寫(xiě)一個(gè)小工具,這個(gè)工具主要就是用來(lái)管理各種資源的信息,比如阿里云的 ECS 等信息,因?yàn)槲夜ぷ鞯碾娔X使用的是 LINUX,所以就想著用 python 寫(xiě)一個(gè)命令行的管理工具,基本的功能就是同步阿里云的資源的信息到數(shù)據(jù)庫(kù),然后可以使用命令行查詢。
因?yàn)樾畔⑹钦宫F(xiàn)在命令行中的,眾所周知,命令行展現(xiàn)復(fù)雜的文本看起來(lái)著實(shí)累人,于是就想著能像表格那樣展示,那看起來(lái)就舒服多了。
prettytable 庫(kù)就是這么一個(gè)工具,prettytable 可以打印出美觀的表格,并且對(duì)中文支持相當(dāng)好(如果有試圖自己實(shí)現(xiàn)打印表格,你就應(yīng)該知道處理中文是多么的麻煩)
2.安裝
prettytable 并非 python 的內(nèi)置庫(kù),通過(guò) pip install prettytable即可安裝。
3.示例
我們先來(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地址']為表頭,如果沒(méi)有添加表頭,那么會(huì)以默認(rèn)的Field+編號(hào)顯示,例如:
+---------+----------+----------+------------+ | Field 1 | Field 2 | Field 3 | Field 4 | +---------+----------+----------+------------+
所以為更直觀看出每一列的意義,還是要添加表頭的。
4.添加數(shù)據(jù)
prettytable提供了多種的添加數(shù)據(jù)的方式,最常用的應(yīng)該就是按行按列添加數(shù)據(jù)了。
按行添加數(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)很重要。
按列添加數(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地址']為列的值,同樣為列表。
從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é)果如下:
PS:csv 文件不能通過(guò) xls 直接重命名得到,會(huì)報(bào)錯(cuò)。如果是 xls 文件,請(qǐng)用另存為 csv 獲得 csv 文件
從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 | +------+----------+----------+------------+
從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='''<table> <tr> <th>編號(hào)</th> <th>云編號(hào)</th> <th>名稱</th> <th>IP地址</th> </tr> <tr> <td>1</td> <td>server01</td> <td>服務(wù)器01</td> <td>172.16.0.1</td> </tr> <tr> <td>2</td> <td>server02</td> <td>服務(wù)器02</td> <td>172.16.0.2</td> </tr> </table>''' 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)[<prettytable.PrettyTable object at 0x7fa87feba590>]這樣的錯(cuò)誤。
這是因?yàn)閠able并不是PrettyTable對(duì)象,而是包含單個(gè)PrettyTable對(duì)象的列表,它通過(guò)解析html而來(lái),所以無(wú)法直接打印table,而需要打印table[0]
5.表格輸出格式
正如支持多種輸入一樣,表格的輸出也支持多種格式,我們?cè)谏厦嬷械睦又幸呀?jīng)使用了print的方式輸出,這是一種常用的輸出方式。
直接通過(guò)print打印出表格。這種方式打印出的表格會(huì)帶邊框。
輸出HTML格式的表格
print(table.get_html_string())可以打印出html標(biāo)簽的表格。
在上面的例子中,使用print(table.get_html_string())會(huì)打印出如下結(jié)果:
<table> <tr> <th>編號(hào)</th> <th>云編號(hào)</th> <th>名稱</th> <th>IP地址</th> </tr> <tr> <td>1</td> <td>server01</td> <td>服務(wù)器01</td> <td>172.16.0.1</td> </tr> <tr> <td>2</td> <td>server02</td> <td>服務(wù)器02</td> <td>172.16.0.2</td> </tr> </table>
6.選擇性輸出
prettytable在創(chuàng)建表格之后,你依然可以有選擇的輸出某些特定的行.
輸出指定的列
print table.get_string(fields=["編號(hào)", "IP地址"])可以輸出指定的列
輸出前兩行
通過(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ō)明了。
將表格切片
從上面的輸出區(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)大,配合切片我們可以自由的輸入任意的行。
輸出排序
有時(shí)候我們需要對(duì)輸出的表格進(jìn)行排序,使用print table.get_string(sortby="編號(hào)", reversesort=True)就可以對(duì)表格進(jìn)行排序,其中reversesort指定了是否倒序排序,默認(rèn)為False,即默認(rèn)正序列排序。
sortby指定了排序的字段。
7.表格的樣式
內(nèi)置樣式
通過(guò)set_style()可以設(shè)置表格樣式,prettytable內(nèi)置了多種的樣式個(gè)人覺(jué)得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)
自定義樣式
除了內(nèi)置的樣式以外,PrettyTable也提供了用戶自定義,例如對(duì)齊方式,數(shù)字輸出格式,邊框連接符等等
設(shè)置對(duì)齊方式
align提供了用戶設(shè)置對(duì)齊的方式,值有l(wèi),r,c方便代表左對(duì)齊,右對(duì)齊和居中 如果不設(shè)置,默認(rèn)居中對(duì)齊。
控制邊框樣式
在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 % $++++++$++++++++++$++++++++++$++++++++++++$
以上就是Python利用prettytable庫(kù)輸出好看的表格的詳細(xì)內(nèi)容,更多關(guān)于Python prettytable的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python prettytable模塊應(yīng)用詳解
- Python利用prettytable實(shí)現(xiàn)格式化輸出內(nèi)容
- python使用prettytable內(nèi)置庫(kù)美化輸出表格
- python?利用?PrettyTable?美化表格
- Python第三方包PrettyTable安裝及用法解析
- Python 使用 prettytable 庫(kù)打印表格美化輸出功能
- Python實(shí)用庫(kù) PrettyTable 學(xué)習(xí)筆記
- python PrettyTable模塊的安裝與簡(jiǎn)單應(yīng)用
- python中prettytable庫(kù)的使用方法
相關(guān)文章
Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南
這篇文章主要介紹了Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南,SimpleHTTPServer本身的功能十分簡(jiǎn)單,文中介紹了需要的朋友可以參考下2016-03-03python通過(guò)定義一個(gè)類實(shí)例作為ftp回調(diào)方法
這篇文章主要介紹了python通過(guò)定義一個(gè)類實(shí)例作為ftp回調(diào)方法,涉及Python中類與回調(diào)方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05基于python+opencv調(diào)用電腦攝像頭實(shí)現(xiàn)實(shí)時(shí)人臉眼睛以及微笑識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于python+opencv調(diào)用電腦攝像頭實(shí)現(xiàn)實(shí)時(shí)人臉眼睛以及微笑識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09使用Python將xmind腦圖轉(zhuǎn)成excel用例的實(shí)現(xiàn)代碼(一)
這篇文章主要介紹了使用Python將xmind腦圖轉(zhuǎn)成excel用例的實(shí)現(xiàn)代碼(一),本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10python flask實(shí)現(xiàn)分頁(yè)的示例代碼
這篇文章主要介紹了python flask實(shí)現(xiàn)分頁(yè)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08使用python批量化音樂(lè)文件格式轉(zhuǎn)換的實(shí)例
今天小編就為大家分享一篇使用python批量化音樂(lè)文件格式轉(zhuǎn)換的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python+selenium+chrome實(shí)現(xiàn)淘寶購(gòu)物車秒殺自動(dòng)結(jié)算
這篇文章主要介紹了python+selenium+chrome實(shí)現(xiàn)淘寶購(gòu)物車秒殺自動(dòng)結(jié)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01