自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實用,5個案例讓Python輸出漂亮的表格!

開發(fā) 后端
因為我工作的電腦使用的是LINUX,所以就想著用 Python寫一個命令行的管理工具,基本的功能就是同步阿里云的資源的信息到數(shù)據庫,然后可以使用命令行查詢。

[[318448]]

1. 前言

最近在用python寫一個小工具,這個工具主要就是用來管理各種資源的信息,比如阿里云的ECS等信息,因為我工作的電腦使用的是LINUX,所以就想著用 Python寫一個命令行的管理工具,基本的功能就是同步阿里云的資源的信息到數(shù)據庫,然后可以使用命令行查詢。

因為信息是展現(xiàn)在命令行中的,眾所周知,命令行展現(xiàn)復雜的文本看起來著實累人,于是就想著能像表格那樣展示,那看起來就舒服多了。

prettytable庫就是這么一個工具,prettytable可以打印出美觀的表格,并且對中文支持相當好(如果有試圖自己實現(xiàn)打印表格,你就應該知道處理中文是多么的麻煩)

說明:本文使用Markdown語法編寫,為了展示方便,以及復制方便,所以本文中沒有使用截圖,因為格式控制的問題,文章中的運行結果會出現(xiàn)一些分割線的偏移,在終端中呈現(xiàn)并此問題,請各位手動去操作驗證。

2. 安裝

prettytable并非python的內置庫,通過 pip install prettytable即可安裝。

3. 一個小示例

我們先來看一個示例: 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. reload(sys)  
  6. sys.setdefaultencoding('utf8')  
  7. table = PrettyTable(['編號','云編號','名稱','IP地址'])  
  8. table.add_row(['1','server01','服務器01','172.16.0.1'])  
  9. table.add_row(['2','server02','服務器02','172.16.0.2'])  
  10. table.add_row(['3','server03','服務器03','172.16.0.3'])  
  11. table.add_row(['4','server04','服務器04','172.16.0.4'])  
  12. table.add_row(['5','server05','服務器05','172.16.0.5'])  
  13. table.add_row(['6','server06','服務器06','172.16.0.6'])  
  14. table.add_row(['7','server07','服務器07','172.16.0.7'])  
  15. table.add_row(['8','server08','服務器08','172.16.0.8'])  
  16. table.add_row(['9','server09','服務器09','172.16.0.9'])  
  17. print(table) 

以上示例運行結果如下: 

  1. linuxops@deepin:~$ python p.py   
  2. +------+----------+----------+------------+  
  3. | 編號 |  云編號  |   名稱   |   IP地址   |  
  4. +------+----------+----------+------------+  
  5. |  1   | server01 | 服務器01 | 172.16.0.1 |  
  6. |  2   | server02 | 服務器02 | 172.16.0.2 |  
  7. |  3   | server03 | 服務器03 | 172.16.0.3 |  
  8. |  4   | server04 | 服務器04 | 172.16.0.4 |  
  9. |  5   | server05 | 服務器05 | 172.16.0.5 |  
  10. |  6   | server06 | 服務器06 | 172.16.0.6 |  
  11. |  7   | server07 | 服務器07 | 172.16.0.7 |  
  12. |  8   | server08 | 服務器08 | 172.16.0.8 |  
  13. |  9   | server09 | 服務器09 | 172.16.0.9 |  
  14. +------+----------+----------+------------+ 

在以上的示例中,我們通過form導入了表格庫。table實例化了一個表格庫,并且添加了['編號','云編號','名稱','IP地址']為表頭,如果沒有添加表頭,那么會以默認的Field+編號顯示,例如: 

  1. +---------+----------+----------+------------+  
  2. | Field 1 | Field 2  | Field 3  |  Field 4   |  
  3. +---------+----------+----------+------------+ 

所以為更直觀看出每一列的意義,還是要添加表頭的。

4. 添加數(shù)據

prettytable提供了多種的添加數(shù)據的方式,最常用的應該就是按行按列添加數(shù)據了。

A、按行添加數(shù)據 table.add_row

在上面簡單的示例中,我們就是按行添加數(shù)據的。

添加的數(shù)據必須要是列表的形式,而且數(shù)據的列表長度要和表頭的長度一樣。在實際的使用中,我們應該要關注到添加的數(shù)據是否和表頭對應,這一點很重要。

B、按列添加數(shù)據 table.add_column()

看下面的示例: 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. reload(sys)  
  6. sys.setdefaultencoding('utf8')  
  7. table = PrettyTable()  
  8. table.add_column('項目', ['編號','云編號','名稱','IP地址'])  
  9. table.add_column('值', ['1','server01','服務器01','172.16.0.1'])  
  10. print(table) 

運行結果如下: 

  1. +-------+--------+------------+  
  2. | index | 項目 |    值     |  
  3. +-------+--------+------------+  
  4. |   1   |  編號  |     1      |  
  5. |   2   | 云編號 |  server01  |  
  6. |   3   |  名稱  |  服務器01   |  
  7. |   4   | IP地址 | 172.16.0.1 |  
  8. +-------+--------+------------+ 

以上示例中,我們通過add_column來按列添加數(shù)據,按列添加數(shù)據不需要在實例化表格的時候制定表頭,它的表頭是在添加列的時候指定的。

table.add_column('項目', ['編號','云編號','名稱','IP地址']) 這一行代碼為例,項目指定了這個列的表頭名為"項目",['編號','云編號','名稱','IP地址']為列的值,同樣為列表。

C、從csv文件添加數(shù)據

PrettyTable不僅提供了手動按行按列添加數(shù)據,也支持直接從csv文件中讀取數(shù)據。 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. from prettytable import from_csv   
  6. reload(sys)  
  7. sys.setdefaultencoding('utf8')  
  8. table = PrettyTable()  
  9. fp = open("res.csv", "r")   
  10. table = from_csv(fp)   
  11. print(table)  
  12. fp.close() 

如果要讀取cvs文件數(shù)據,必須要先導入from_csv,否則無法運行。上面的示例運行結果如下: 

  1. +------+----------+----------+------------+  
  2. | 編號 |  云編號  |   名稱   |   IP地址   |  
  3. +------+----------+----------+------------+  
  4. |  1   | server01 | 服務器01 | 172.16.0.1 |  
  5. |  2   | server02 | 服務器02 | 172.16.0.2 |  
  6. |  3   | server03 | 服務器03 | 172.16.0.3 |  
  7. |  4   | server04 | 服務器04 | 172.16.0.4 |  
  8. |  5   | server05 | 服務器05 | 172.16.0.5 |  
  9. |  6   | server06 | 服務器06 | 172.16.0.6 |  
  10. |  7   | server07 | 服務器07 | 172.16.0.7 |  
  11. |  8   | server08 | 服務器08 | 172.16.0.8 |  
  12. |  9   | server09 | 服務器09 | 172.16.0.9 |  
  13. +------+----------+----------+------------+ 

csv文件不能通過xls直接重命名得到,會報錯。如果是xls文件,請用另存為csv獲得csv文件

D、從sql查詢值添加

從數(shù)據庫查詢出來的數(shù)據可以直接導入到表格打印,下面的例子使用了sqlite3,如果使用的是mysql也是一樣的,只要能查詢到數(shù)據就能導入到表格中 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. from prettytable import from_db_cursor   
  6. import sqlite3  
  7. reload(sys)  
  8. sys.setdefaultencoding('utf8')  
  9. conn = sqlite3.connect("/tmp/aliyun.db")  
  10. cur = conn.cursor()  
  11. cur.execute("SELECT * FROM res")   
  12. table = from_db_cursor(cur) 
  13.  print(table) 

運行結果如下: 

  1. +------+----------+----------+------------+  
  2. | 編號 |  云編號  |   名稱   |   IP地址   |  
  3. +------+----------+----------+------------+  
  4. |  1   | server01 | 服務器01 | 172.16.0.1 |  
  5. |  2   | server02 | 服務器02 | 172.16.0.2 |  
  6. |  3   | server03 | 服務器03 | 172.16.0.3 |  
  7. |  4   | server04 | 服務器04 | 172.16.0.4 |  
  8. |  5   | server05 | 服務器05 | 172.16.0.5 |  
  9. |  6   | server06 | 服務器06 | 172.16.0.6 |  
  10. |  7   | server07 | 服務器07 | 172.16.0.7 |  
  11. |  8   | server08 | 服務器08 | 172.16.0.8 |  
  12. |  9   | server09 | 服務器09 | 172.16.0.9 |  
  13. +------+----------+----------+------------+ 

E、從HTML導入數(shù)據

支持從html的表格中導入,請看下面這個例子: 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. from prettytable import from_html   
  6. reload(sys)  
  7. sys.setdefaultencoding('utf8')  
  8. html_string='''<table>  
  9. <tr>  
  10. <th>編號</th>  
  11. <th>云編號</th>  
  12. <th>名稱</th>  
  13. <th>IP地址</th>  
  14. </tr>  
  15. <tr>  
  16. <td>1</td>  
  17. <td>server01</td>  
  18. <td>服務器01</td>  
  19. <td>172.16.0.1</td>  
  20. </tr>  
  21. <tr>  
  22. <td>2</td>  
  23. <td>server02</td>  
  24. <td>服務器02</td>  
  25. <td>172.16.0.2</td>  
  26. </tr>  
  27. </table>'''  
  28. table = from_html(html_string)  
  29. print(table[0]) 

運行結果如下: 

  1. +------+----------+----------+------------+  
  2. | 編號 |  云編號  |   名稱   |   IP地址   |  
  3. +------+----------+----------+------------+  
  4. |  1   | server01 | 服務器01 | 172.16.0.1 |  
  5. |  2   | server02 | 服務器02 | 172.16.0.2 |  
  6. +------+----------+----------+------------+ 

如上示例中,我們可以導入html的表格,但是不一樣的地方是print語句,使用html表格導入數(shù)據的時候print的必須是列表中的第一個元素,否則有可能會報[]這樣的錯誤。

這是因為table并不是PrettyTable對象,而是包含單個PrettyTable對象的列表,它通過解析html而來,所以無法直接打印table,而需要打印table[0]

5. 表格輸出格式

正如支持多種輸入一樣,表格的輸出也支持多種格式,我們在上面中的例子中已經使用了print的方式輸出,這是一種常用的輸出方式。

A、print

直接通過print打印出表格。這種方式打印出的表格會帶邊框。

B、輸出HTML格式的表格

print(table.get_html_string())可以打印出html標簽的表格。

在上面的例子中,使用print(table.get_html_string())會打印出如下結果: 

  1. <table>  
  2.     <tr>  
  3.         <th>編號</th>  
  4.         <th>云編號</th>  
  5.         <th>名稱</th>  
  6.         <th>IP地址</th>  
  7.     </tr>  
  8.     <tr>  
  9.         <td>1</td>  
  10.         <td>server01</td>  
  11.         <td>服務器01</td>  
  12.         <td>172.16.0.1</td>  
  13.     </tr>  
  14.     <tr>  
  15.         <td>2</td>  
  16.         <td>server02</td>  
  17.         <td>服務器02</td>  
  18.         <td>172.16.0.2</td>  
  19.     </tr>  
  20. </table> 

6. 選擇性輸出

prettytable在創(chuàng)建表格之后,你依然可以有選擇的輸出某些特定的行.

A、輸出指定的列

print table.get_string(fields=["編號", "IP地址"])可以輸出指定的列

B、輸出前兩行

通過print(table.get_string(start = 0, end = 2))的可以打印出指定的列,當然start和end參數(shù)讓我可以自由控制顯示區(qū)間。當然區(qū)間中包含start不包含end,是不是很熟悉這樣的用法?

根據輸出指定行列的功能,我們可以同時指定行和列來輸出,這里就不說明了。

C、將表格切片

從上面的輸出區(qū)間,我們做一個大膽的假設,既然區(qū)間包含start不包含end這種規(guī)則和切片的一樣,我們可以不可通過切片來生成一個新的表格然后將其打印。

事實上是可以的。 

  1. new_table = table[0:2]  
  2. print(new_table) 

如上代碼段中,我們就可以打印出0到1行共2行的表格,python的切片功能異常強大,配合切片我們可以自由的輸入任意的行。

D、輸出排序

有時候我們需要對輸出的表格進行排序,使用print table.get_string(sortby="編號", reversesort=True)就可以對表格進行排序,其中reversesort指定了是否倒序排序,默認為False,即默認正序列排序。

sortby指定了排序的字段。

7. 表格的樣式

A、內置樣式

通過set_style()可以設置表格樣式,prettytable內置了多種的樣式個人覺得MSWORD_FRIENDLY,PLAIN_COLUMNS,DEFAULT 這三種樣式看起來比較清爽,在終端下顯示表格本來看起就很累,再加上一下花里胡哨的東西看起來就更累。

除了以上推薦的三種樣式以外,還有一種樣式不得不說,那就是RANDOM,這是一種隨機的樣式,每一次打印都會在內置的樣式中隨機選擇一個,比較好玩。

具體內置了幾種樣式,請各位參考官網完整自己嘗試輸出看看。 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. from prettytable import MSWORD_FRIENDLY  
  6. from prettytable import PLAIN_COLUMNS  
  7. from prettytable import RANDOM  
  8. from prettytable import DEFAULT  
  9. reload(sys)  
  10. sys.setdefaultencoding('utf8')  
  11. table = PrettyTable(['編號','云編號','名稱','IP地址'])  
  12. table.add_row(['1','server01','服務器01','172.16.0.1'])  
  13. table.add_row(['3','server03','服務器03','172.16.0.3'])  
  14. table.add_row(['2','server02','服務器02','172.16.0.2'])  
  15. table.add_row(['9','server09','服務器09','172.16.0.9'])  
  16. table.add_row(['4','server04','服務器04','172.16.0.4'])  
  17. table.add_row(['5','server05','服務器05','172.16.0.5'])  
  18. table.add_row(['6','server06','服務器06','172.16.0.6'])  
  19. table.add_row(['8','server08','服務器08','172.16.0.8'])  
  20. table.add_row(['7','server07','服務器07','172.16.0.7'])  
  21. table.set_style(DEFAULT)  
  22. print(table) 

B、自定義樣式

除了內置的樣式以外,PrettyTable也提供了用戶自定義,例如對齊方式,數(shù)字輸出格式,邊框連接符等等

C、設置對齊方式

align提供了用戶設置對齊的方式,值有l(wèi),r,c方便代表左對齊,右對齊和居中 如果不設置,默認居中對齊。

D、控制邊框樣式

在PrettyTable中,邊框由三個部分組成,橫邊框,豎邊框,和邊框連接符(橫豎交叉的鏈接符號)

如下示例: 

  1. #!/usr/bin/python  
  2. #**coding:utf-8**  
  3. import sys  
  4. from prettytable import PrettyTable  
  5. reload(sys)  
  6. sys.setdefaultencoding('utf8')  
  7. table = PrettyTable(['編號','云編號','名稱','IP地址'])  
  8. table.add_row(['1','server01','服務器01','172.16.0.1'])  
  9. table.add_row(['3','server03','服務器03','172.16.0.3'])  
  10. table.add_row(['2','server02','服務器02','172.16.0.2'])  
  11. table.add_row(['9','server09','服務器09','172.16.0.9'])  
  12. table.add_row(['4','server04','服務器04','172.16.0.4'])  
  13. table.add_row(['5','server05','服務器05','172.16.0.5'])  
  14. table.add_row(['6','server06','服務器06','172.16.0.6'])  
  15. table.add_row(['8','server08','服務器08','172.16.0.8'])  
  16. table.add_row(['7','server07','服務器07','172.16.0.7'])  
  17. table.align[1] = 'l'  
  18. table.border = True  
  19. table.junction_char='$'  
  20. table.horizontal_char = '+'  
  21. table.vertical_char = '%'  
  22. print(table)  
  23. table.border`控制是否顯示邊框,默認是`True 

table.junction_char控制邊框連接符

table.horizontal_char控制橫邊框符號

table.vertical_char控制豎邊框符號

上例運行如下: 

  1. $++++++$++++++++++$++++++++++$++++++++++++$  
  2. % 編號 %  云編號  %   名稱   %   IP地址   %  
  3. $++++++$++++++++++$++++++++++$++++++++++++$  
  4. %  1   % server01 % 服務器01 % 172.16.0.1 %  
  5. %  3   % server03 % 服務器03 % 172.16.0.3 %  
  6. %  2   % server02 % 服務器02 % 172.16.0.2 %  
  7. %  9   % server09 % 服務器09 % 172.16.0.9 %  
  8. %  4   % server04 % 服務器04 % 172.16.0.4 %  
  9. %  5   % server05 % 服務器05 % 172.16.0.5 %  
  10. %  6   % server06 % 服務器06 % 172.16.0.6 %  
  11. %  8   % server08 % 服務器08 % 172.16.0.8 %  
  12. %  7   % server07 % 服務器07 % 172.16.0.7 %  
  13. $++++++$++++++++++$++++++++++$++++++++++++$ 

以上簡單介紹了表格常用的一些樣式設置,具體的請參考官方網站。 

 

責任編輯:龐桂玉 來源: 戀習Python
相關推薦

2022-01-07 14:20:12

Python命令工具

2021-02-05 10:57:03

邊緣計算首席運營官

2020-04-27 09:40:13

Reacthooks前端

2021-07-01 09:43:44

Python函數(shù)參數(shù)

2022-01-17 10:50:15

Python代碼內存

2012-05-09 09:49:57

移動支付

2020-04-30 09:17:28

數(shù)據分析電商分析思維

2024-01-16 12:19:08

MySQL重要機制高并發(fā)

2025-03-27 10:03:17

PythonPandas代碼

2011-03-30 13:03:14

數(shù)據庫營銷

2021-03-30 18:11:05

Python工具代碼

2020-10-13 09:38:39

Python迭代開發(fā)

2018-12-18 10:43:07

2025-04-11 02:44:00

2025-04-24 10:20:00

2020-07-07 08:01:37

nc命令Linux網絡命令行工具

2016-11-28 08:56:15

透析大數(shù)據核心

2011-03-31 11:15:52

網頁設計Web

2024-09-12 17:05:13

2024-11-11 07:00:00

Python編程
點贊
收藏

51CTO技術棧公眾號