1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python輸出簡潔美觀的文本化表格

        共 8714字,需瀏覽 18分鐘

         ·

        2021-02-15 13:44


        原文:

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

        作者:Linuxops


        一、前言

        大家好,歡迎來到 Crossin的編程教室 !


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


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


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


        二、安裝


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



        三、一個(gè)小示例


        我們先來看一個(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 |
        +------+----------+----------+------------+

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

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

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



        四、添加數(shù)據(jù)


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


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


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


        添加的數(shù)據(jù)必須要是列表的形式,而且數(shù)據(jù)的列表長度要和表頭的長度一樣。在實(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 |
        +-------+--------+------------+


        以上示例中,我們通過add_column來按列添加數(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,否則無法運(yùn)行。上面的示例運(yùn)行結(jié)果如下:
        PS:csv 文件不能通過 xls 直接重命名得到,會(huì)報(bào)錯(cuò)。如果是 xls 文件,請(qǐng)用另存為 csv 獲得 csv 文件

        D、從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é)果如下:
        +------+----------+----------+------------+
        | 編號(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地址
        1server01服務(wù)器01172.16.0.1
        2server02服務(wù)器02172.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語句,使用html表格導(dǎo)入數(shù)據(jù)的時(shí)候print的必須是列表中的第一個(gè)元素,否則有可能會(huì)報(bào)[]這樣的錯(cuò)誤。
        這是因?yàn)?/span>table并不是PrettyTable對(duì)象,而是包含單個(gè)PrettyTable對(duì)象的列表,它通過解析html而來,所以無法直接打印table,而需要打印table[0]


        五、表格輸出格式


        正如支持多種輸入一樣,表格的輸出也支持多種格式,我們?cè)谏厦嬷械睦又幸呀?jīng)使用了print的方式輸出,這是一種常用的輸出方式。


        A、print


        直接通過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


        六、選擇性輸出


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

        A、輸出指定的列


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


        B、輸出前兩行


        通過print(table.get_string(start = 0, end = 2))的可以打印出指定的列,當(dāng)然startend參數(shù)讓我可以自由控制顯示區(qū)間。當(dāng)然區(qū)間中包含start不包含end,是不是很熟悉這樣的用法?
        根據(jù)輸出指定行列的功能,我們可以同時(shí)指定行和列來輸出,這里就不說明了。


        C、將表格切片


        從上面的輸出區(qū)間,我們做一個(gè)大膽的假設(shè),既然區(qū)間包含start不包含end這種規(guī)則和切片的一樣,我們可以不可通過切片來生成一個(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指定了排序的字段。

        七、表格的樣式


        A、內(nèi)置樣式


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

        除了以上推薦的三種樣式以外,還有一種樣式不得不說,那就是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 %
        $++++++$++++++++++$++++++++++$++++++++++++$

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

        如果文章對(duì)你有幫助,歡迎轉(zhuǎn)發(fā)/點(diǎn)贊/收藏!

        來源:極客猴


        _往期文章推薦_

        Python格式化字符串的最佳姿勢(shì)




        瀏覽 26
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91丨豆花丨国产熟女 | 天堂俺去俺来也WWW色光网 | 噜噜噜久久,亚洲精品国产品 | 一道本在线无码 | 六月丁香五月婷婷 | 免费看小男生裸体 | 亚洲无码在线资源 | 欧美啪啪啪网站 | 婷婷五月综合激情 | 色操色|