<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          輸出好看的表格,就用這個 Python 庫!

          共 8828字,需瀏覽 18分鐘

           ·

          2021-11-01 13:48

          # 1. 前言

          最近在用 Python 寫一個小工具,這個工具主要就是用來管理各種資源的信息,比如阿里云的 ECS 等信息,因?yàn)槲夜ぷ鞯碾娔X使用的是 LINUX,所以就想著用 python 寫一個命令行的管理工具,基本的功能就是同步阿里云的資源的信息到數(shù)據(jù)庫,然后可以使用命令行查詢。

          因?yàn)樾畔⑹钦宫F(xiàn)在命令行中的,眾所周知,命令行展現(xiàn)復(fù)雜的文本看起來著實(shí)累人,于是就想著能像表格那樣展示,那看起來就舒服多了。

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

          # 2. 安裝

          prettytable 并非 python 的內(nèi)置庫,通過 pip install prettytable即可安裝。

          # 3. 示例

          我們先來看一個示例:

          #!/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','服務(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
          +------+----------+----------+------------+
          |?編號?|??云編號??|???名稱???|???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?|
          +------+----------+----------+------------+

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

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

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

          # 4. 添加數(shù)據(jù)

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

          ?按行添加數(shù)據(jù) table.add_row

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

          添加的數(shù)據(jù)必須要是列表的形式,而且數(shù)據(jù)的列表長度要和表頭的長度一樣。在實(shí)際的使用中,我們應(yīng)該要關(guān)注到添加的數(shù)據(jù)是否和表頭對應(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)目',?['編號','云編號','名稱','IP地址'])
          table.add_column('值',?['1','server01','服務(wù)器01','172.16.0.1'])
          print(table)

          運(yùn)行結(jié)果如下:

          +-------+--------+------------+
          |?index?|?項(xiàng)目?|????值?????|
          +-------+--------+------------+
          |???1???|??編號??|?????1??????|
          |???2???|?云編號?|??server01??|
          |???3???|??名稱??|??服務(wù)器01???|
          |???4???|?IP地址?|?172.16.0.1?|
          +-------+--------+------------+

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

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

          ?從csv文件添加數(shù)據(jù)

          PrettyTable不僅提供了手動按行按列添加數(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,否則無法運(yùn)行。上面的示例運(yùn)行結(jié)果如下:

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

          ?從sql查詢值添加

          從數(shù)據(jù)庫查詢出來的數(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é)果如下:

          +------+----------+----------+------------+
          |?編號?|??云編號??|???名稱???|???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)入,請看下面這個例子:

          #!/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>編號th>
          <th>云編號th>
          <th>名稱th>
          <th>IP地址th>
          tr>
          <tr>
          <td>1td>
          <td>server01td>
          <td>服務(wù)器01td>
          <td>172.16.0.1td>
          tr>
          <tr>
          <td>2td>
          <td>server02td>
          <td>服務(wù)器02td>
          <td>172.16.0.2td>
          tr>
          table>'''

          table?=?from_html(html_string)

          print(table[0])

          運(yùn)行結(jié)果如下:

          +------+----------+----------+------------+
          |?編號?|??云編號??|???名稱???|???IP地址???|
          +------+----------+----------+------------+
          |
          ??1???|?server01?|?服務(wù)器01?|?172.16.0.1?|
          |??2???|?server02?|?服務(wù)器02?|?172.16.0.2?|
          +------+----------+----------+------------+

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

          這是因?yàn)?code style="font-size: inherit;line-height: inherit;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(226, 36, 70);background: rgb(248, 248, 248);">table并不是PrettyTable對象,而是包含單個PrettyTable對象的列表,它通過解析html而來,所以無法直接打印table,而需要打印table[0]

          # 5. 表格輸出格式

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

          ?print

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

          ?輸出HTML格式的表格

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

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

          <table>
          ????<tr>
          ????????<th>編號th>
          ????????<th>云編號th>
          ????????<th>名稱th>
          ????????<th>IP地址th>
          ????tr>
          ????<tr>
          ????????<td>1td>
          ????????<td>server01td>
          ????????<td>服務(wù)器01td>
          ????????<td>172.16.0.1td>
          ????tr>
          ????<tr>
          ????????<td>2td>
          ????????<td>server02td>
          ????????<td>服務(wù)器02td>
          ????????<td>172.16.0.2td>
          ????tr>
          table>

          # 6. 選擇性輸出

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

          ?輸出指定的列

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

          ?輸出前兩行

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

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

          ?將表格切片

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

          事實(shí)上是可以的。

          new_table?=?table[0:2]
          print(new_table)

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

          ?輸出排序

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

          sortby指定了排序的字段。

          # 7. 表格的樣式

          ?內(nèi)置樣式

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

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

          具體內(nèi)置了幾種樣式,請各位參考官網(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(['編號','云編號','名稱','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也提供了用戶自定義,例如對齊方式,數(shù)字輸出格式,邊框連接符等等

          ?設(shè)置對齊方式

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

          ?控制邊框樣式

          在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','服務(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控制橫邊框符號

          table.vertical_char控制豎邊框符號

          上例運(yùn)行如下:

          $++++++$++++++++++$++++++++++$++++++++++++$
          %?編號?%??云編號??%???名稱???%???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?%
          $++++++$++++++++++$++++++++++$++++++++++++$

          以上簡單介紹了表格常用的一些樣式設(shè)置。更具體的方法可參數(shù)請參考官方網(wǎng)站:

          https://github.com/jazzband/prettytable

          原文鏈接:https://linuxops.org/blog/python/prettytable.html

          作者:Linuxops


          --END--

          如何找到我:

          近期優(yōu)質(zhì)文章:

          手把手教你從零開始搭建個人博客,20分鐘上手

          值得收藏的30道Python練手題(附詳細(xì)答案,文末贈書)

          原創(chuàng)回答|用 Python 進(jìn)行數(shù)據(jù)分析,學(xué)習(xí)書籍或資料推薦?

          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了
          點(diǎn)贊”就是對博主最大的支持?
          瀏覽 24
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  靠逼网站免费观看 | 嘛豆三级片电影 | 天堂8中文在线 | 大香蕉伊人在钱 | 国产一卡二卡在线播放 |