5個案例讓Python輸出漂亮的表格

5個案例讓Python輸出漂亮的表格

5個案例讓Python輸出漂亮的表格

來源 | Python數據之道

5个案例让Python输出漂亮的表格

前言

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

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

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

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

5个案例让Python输出漂亮的表格

安裝

prettytable並非python的內置庫,通過 <code>pip install prettytable/<code>即可安裝。

5个案例让Python输出漂亮的表格

一個小示例

我們先來看一個示例:

#!/usr/bin/python

#**coding:utf-8**

import sys

from prettytable import PrettyTable

reload(sys)

sys.setdefaultencoding('utf8')

table = PrettyTable(['編號','雲編號','名稱','IP地址'])

table.add_row(['1','server01','服務器01','172.16.0.1'])

table.add_row(['2','server02','服務器02','172.16.0.2'])

table.add_row(['3','server03','服務器03','172.16.0.3'])

table.add_row(['4','server04','服務器04','172.16.0.4'])

table.add_row(['5','server05','服務器05','172.16.0.5'])

table.add_row(['6','server06','服務器06','172.16.0.6'])

table.add_row(['7','server07','服務器07','172.16.0.7'])

table.add_row(['8','server08','服務器08','172.16.0.8'])

table.add_row(['9','server09','服務器09','172.16.0.9'])

print(table)

以上示例運行結果如下:

linuxops@deepin:~$ python p.py

+------+----------+----------+------------+

| 編號 | 雲編號 | 名稱 | IP地址 |

+------+----------+----------+------------+

| 1 | server01 | 服務器01 | 172.16.0.1 |

| 2 | server02 | 服務器02 | 172.16.0.2 |

| 3 | server03 | 服務器03 | 172.16.0.3 |

| 4 | server04 | 服務器04 | 172.16.0.4 |

| 5 | server05 | 服務器05 | 172.16.0.5 |

| 6 | server06 | 服務器06 | 172.16.0.6 |

| 7 | server07 | 服務器07 | 172.16.0.7 |

| 8 | server08 | 服務器08 | 172.16.0.8 |

| 9 | server09 | 服務器09 | 172.16.0.9 |

+------+----------+----------+------------+

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

+---------+----------+----------+------------+

| Field 1 | Field 2 | Field 3 | Field 4 |

+---------+----------+----------+------------+

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

5个案例让Python输出漂亮的表格

添加數據

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

A、按行添加數據 table.add_row

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

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

B、按列添加數據 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('項目', ['編號','雲編號','名稱','IP地址'])

table.add_column('值', ['1','server01','服務器01','172.16.0.1'])

print(table)

運行結果如下:

+-------+--------+------------+

| index | 項目 | 值 |

+-------+--------+------------+

| 1 | 編號 | 1 |

| 2 | 雲編號 | server01 |

| 3 | 名稱 | 服務器01 |

| 4 | IP地址 | 172.16.0.1 |

+-------+--------+------------+

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

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

C、從csv文件添加數據

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

#!/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文件數據,必須要先導入<code>from_csv/<code>,否則無法運行。上面的示例運行結果如下:

+------+----------+----------+------------+

| 編號 | 雲編號 | 名稱 | IP地址 |

+------+----------+----------+------------+

| 1 | server01 | 服務器01 | 172.16.0.1 |

| 2 | server02 | 服務器02 | 172.16.0.2 |

| 3 | server03 | 服務器03 | 172.16.0.3 |

| 4 | server04 | 服務器04 | 172.16.0.4 |

| 5 | server05 | 服務器05 | 172.16.0.5 |

| 6 | server06 | 服務器06 | 172.16.0.6 |

| 7 | server07 | 服務器07 | 172.16.0.7 |

| 8 | server08 | 服務器08 | 172.16.0.8 |

| 9 | server09 | 服務器09 | 172.16.0.9 |

+------+----------+----------+------------+

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

D、從sql查詢值添加

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

#!/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)

運行結果如下:

+------+----------+----------+------------+

| 編號 | 雲編號 | 名稱 | IP地址 |

+------+----------+----------+------------+

| 1 | server01 | 服務器01 | 172.16.0.1 |

| 2 | server02 | 服務器02 | 172.16.0.2 |

| 3 | server03 | 服務器03 | 172.16.0.3 |

| 4 | server04 | 服務器04 | 172.16.0.4 |

| 5 | server05 | 服務器05 | 172.16.0.5 |

| 6 | server06 | 服務器06 | 172.16.0.6 |

| 7 | server07 | 服務器07 | 172.16.0.7 |

| 8 | server08 | 服務器08 | 172.16.0.8 |

| 9 | server09 | 服務器09 | 172.16.0.9 |

+------+----------+----------+------------+

E、從HTML導入數據

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

 

#!/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>

編號

雲編號

名稱

IP地址

1

server01

服務器01

172.16.0.1

2

server02

服務器02

172.16.0.2

/<table>'''

table = from_html(html_string)

print(table[0])

運行結果如下:

+------+----------+----------+------------+

| 編號 | 雲編號 | 名稱 | IP地址 |

+------+----------+----------+------------+

| 1 | server01 | 服務器01 | 172.16.0.1 |

| 2 | server02 | 服務器02 | 172.16.0.2 |

+------+----------+----------+------------+

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

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

5个案例让Python输出漂亮的表格

表格輸出格式

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

A、print

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

B、輸出HTML格式的表格

<code>print(table.get_html_string)/<code>可以打印出html標籤的表格。

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

<table>

編號

雲編號

名稱

IP地址

1

server01

服務器01

172.16.0.1

2

server02

服務器02

172.16.0.2

/<table>5个案例让Python输出漂亮的表格

選擇性輸出

prettytable在創建表格之後,你依然可以有選擇的輸出某些特定的行.

A、輸出指定的列

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

B、輸出前兩行

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

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

C、將表格切片

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

事實上是可以的。

new_table = table[0:2]

print(new_table)

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

D、輸出排序

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

<code>sortby/<code>指定了排序的字段。

5个案例让Python输出漂亮的表格

表格的樣式

A、內置樣式

通過<code>set_style/<code>可以設置表格樣式,prettytable內置了多種的樣式個人覺得<code>MSWORD_FRIENDLY/<code>,<code>PLAIN_COLUMNS/<code>,<code>DEFAULT/<code>這三種樣式看起來比較清爽,在終端下顯示錶格本來看起就很累,再加上一下花裡胡哨的東西看起來就更累。除了以上推薦的三種樣式以外,還有一種樣式不得不說,那就是<code>RANDOM/<code>,這是一種隨機的樣式,每一次打印都會在內置的樣式中隨機選擇一個,比較好玩。

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

#!/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(['編號','雲編號','名稱','IP地址'])
table.add_row(['1','server01','服務器01','172.16.0.1'])
table.add_row(['3','server03','服務器03','172.16.0.3'])
table.add_row(['2','server02','服務器02','172.16.0.2'])
table.add_row(['9','server09','服務器09','172.16.0.9'])
table.add_row(['4','server04','服務器04','172.16.0.4'])
table.add_row(['5','server05','服務器05','172.16.0.5'])
table.add_row(['6','server06','服務器06','172.16.0.6'])
table.add_row(['8','server08','服務器08','172.16.0.8'])
table.add_row(['7','server07','服務器07','172.16.0.7'])
table.set_style(DEFAULT)

print(table)

B、自定義樣式

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

C、設置對齊方式

<code>align/<code>提供了用戶設置對齊的方式,值有<code>l/<code>,<code>r/<code>,<code>c/<code>方便代表左對齊,右對齊和居中 如果不設置,默認居中對齊。

D、控制邊框樣式

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

如下示例:

#!/usr/bin/python
#**coding:utf-8**
import sys
from prettytable import PrettyTable

reload(sys)
sys.setdefaultencoding('utf8')

table = PrettyTable(['編號','雲編號','名稱','IP地址'])
table.add_row(['1','server01','服務器01','172.16.0.1'])
table.add_row(['3','server03','服務器03','172.16.0.3'])
table.add_row(['2','server02','服務器02','172.16.0.2'])
table.add_row(['9','server09','服務器09','172.16.0.9'])
table.add_row(['4','server04','服務器04','172.16.0.4'])
table.add_row(['5','server05','服務器05','172.16.0.5'])
table.add_row(['6','server06','服務器06','172.16.0.6'])
table.add_row(['8','server08','服務器08','172.16.0.8'])
table.add_row(['7','server07','服務器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`控制是否顯示邊框,默認是`True

<code>table.junction_char/<code>控制邊框連接符<code>table.horizontal_char/<code>控制橫邊框符號<code>table.vertical_char/<code>控制豎邊框符號

上例運行如下:

$++++++$++++++++++$++++++++++$++++++++++++$ 

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

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

https://linuxops.org/blog/python/prettytable.html

【end】



有獎徵文


5個案例讓Python輸出漂亮的表格
  • 2020年,5種將死的編程語言

  • 檢測、量化、追蹤新冠病毒,基於深度學習的自動CT圖像分析有多靠譜?

  • GitHub 接連封殺開源項目惹眾怒,CEO 親自道歉!

  • 智能合約編寫之 Solidity 的設計模式

  • 低學歷、文科出身,我如何從月薪不到 3000 逆襲為大廠高薪程序員?

  • 從提取層、處理層、基礎結構入手,帶你瞭解Spark和Kafka!

你點的每個“在看”,我都認真當成了AI


分享到:


相關文章: