Python實用庫--PrettyTable

厚礼蝎發表於2024-06-16

簡介

PrettyTable是一個強大的Python第三方庫,專門設計用於從程式中生成美觀、易於閱讀的ASCII格式表格。

在資料分析、命令列工具開發、指令碼編寫等領域中,特別是在需要直觀呈現資料而又不依賴圖形介面的情況下,PrettyTable庫顯得尤為實用。

其設計靈感來源於PostgreSQL的psql工具中所使用的ASCII表格風格,為使用者提供了一種簡潔而靈活的方式來組織和呈現資料。

它的slogan就是 “以美觀的 ASCII 表格格式顯示錶格資料”

官網

  • 程式碼倉庫:https://github.com/jazzband/prettytable
  • 包:https://pypi.org/project/prettytable/

安裝

pip install prettytable

或者

poetry add prettytable

安裝最新的開發版本:

python -m pip install -U git+https://github.com/jazzband/prettytable

使用

初始化建立表格

from prettytable import PrettyTable

# 初始化一個PrettyTable物件
table = PrettyTable()

插入資料

最簡單的使用

from prettytable import PrettyTable

# 初始化一個PrettyTable物件
table = PrettyTable()

# 定義表格的欄位名,即表格的列標題
table.field_names = ["City name", "Area", "Population", "Annual Rainfall"]

# 新增行資料,每一行代表一個城市的名稱、面積、人口和年降雨量
table.add_row(["Adelaide", 1295, 1158259, 600.5])
table.add_row(["Brisbane", 5905, 1857594, 1146.4])
table.add_row(["Darwin", 112, 120900, 1714.7])
table.add_row(["Hobart", 1357, 205556, 619.5])
table.add_row(["Sydney", 2058, 4336374, 1214.8])
table.add_row(["Melbourne", 1566, 3806092, 646.9])
table.add_row(["Perth", 5386, 1554769, 869.4])

# 輸出格式化後的表格
print(table)

"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+
"""

多行插入資料

上面的是透過 table.add_row([]) 來一行行的新增資料,用的也是最多的

也可以一次性插入多條資料

透過 add_rows() 方法

from prettytable import PrettyTable

# 初始化一個PrettyTable物件
table = PrettyTable()

# 定義表格的欄位名,即表格的列標題
table.field_names = ["City name", "Area", "Population", "Annual Rainfall"]

# 新增行資料,每一行代表一個城市的名稱、面積、人口和年降雨量
table.add_rows(
    [
        ["Adelaide", 1295, 1158259, 600.5],
        ["Brisbane", 5905, 1857594, 1146.4],
        ["Darwin", 112, 120900, 1714.7],
        ["Hobart", 1357, 205556, 619.5],
        ["Sydney", 2058, 4336374, 1214.8],
        ["Melbourne", 1566, 3806092, 646.9],
        ["Perth", 5386, 1554769, 869.4],
    ]
)

# 輸出格式化後的表格
print(table)

"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+
"""

得到的結果也是一樣的

按列插入

上面都是一行一行的插入,也可以一列一列的插入

透過 add_column() 方法插入一列一列的資料

from prettytable import PrettyTable

# 初始化一個PrettyTable物件
table = PrettyTable()

# 新增行資料,每一行代表一個城市的名稱、面積、人口和年降雨量
table.add_column("City name",["Adelaide", "Brisbane", "Darwin", "Hobart", "Sydney", "Melbourne", "Perth"])
table.add_column("Area", [1295, 5905, 112, 1357, 2058, 1566, 5386])
table.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769])
table.add_column("Annual Rainfall", [600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9,869.4])

# 輸出格式化後的表格
print(table)

"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+
"""

輸出

最簡單的資料,直接 print()

輸出的就是表格字串

實際上還可以輸出很多中型別的

以上面的表格為例

from prettytable import PrettyTable

# 初始化一個PrettyTable物件
table = PrettyTable()

# 定義表格的欄位名,即表格的列標題
table.field_names = ["City name", "Area", "Population", "Annual Rainfall"]

# 新增行資料,每一行代表一個城市的名稱、面積、人口和年降雨量
table.add_row(["Adelaide", 1295, 1158259, 600.5])
table.add_row(["Brisbane", 5905, 1857594, 1146.4])
table.add_row(["Darwin", 112, 120900, 1714.7])
table.add_row(["Hobart", 1357, 205556, 619.5])
table.add_row(["Sydney", 2058, 4336374, 1214.8])
table.add_row(["Melbourne", 1566, 3806092, 646.9])
table.add_row(["Perth", 5386, 1554769, 869.4])

以字串形式輸出

這個也是預設輸出方式

如果要顯式指定的話,使用 get_string() 方法

print(table)
# 或者顯式指定
print(table.get_string())

"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+
"""

以CSV格式的字串輸出

print(table.get_csv_string())

"""
輸出
City name,Area,Population,Annual Rainfall
Adelaide,1295,1158259,600.5
Brisbane,5905,1857594,1146.4
Darwin,112,120900,1714.7
Hobart,1357,205556,619.5
Sydney,2058,4336374,1214.8
Melbourne,1566,3806092,646.9
Perth,5386,1554769,869.4
"""

以html格式的字串輸出

print(table.get_html_string())

"""
輸出
<table>
    <thead>
        <tr>
            <th>City name</th>
            <th>Area</th>
            <th>Population</th>
            <th>Annual Rainfall</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Adelaide</td>
            <td>1295</td>
            <td>1158259</td>
            <td>600.5</td>
        </tr>
        <tr>
            <td>Brisbane</td>
            <td>5905</td>
            <td>1857594</td>
            <td>1146.4</td>
        </tr>
        <tr>
            <td>Darwin</td>
            <td>112</td>
            <td>120900</td>
            <td>1714.7</td>
        </tr>
        <tr>
            <td>Hobart</td>
            <td>1357</td>
            <td>205556</td>
            <td>619.5</td>
        </tr>
        <tr>
            <td>Sydney</td>
            <td>2058</td>
            <td>4336374</td>
            <td>1214.8</td>
        </tr>
        <tr>
            <td>Melbourne</td>
            <td>1566</td>
            <td>3806092</td>
            <td>646.9</td>
        </tr>
        <tr>
            <td>Perth</td>
            <td>5386</td>
            <td>1554769</td>
            <td>869.4</td>
        </tr>
    </tbody>
</table>
"""

以json格式的字串輸出

print(table.get_json_string())

"""
輸出
[
    [
        "City name",
        "Area",
        "Population",
        "Annual Rainfall"
    ],
    {
        "Annual Rainfall": 600.5,
        "Area": 1295,
        "City name": "Adelaide",
        "Population": 1158259
    },
    {
        "Annual Rainfall": 1146.4,
        "Area": 5905,
        "City name": "Brisbane",
        "Population": 1857594
    },
    {
        "Annual Rainfall": 1714.7,
        "Area": 112,
        "City name": "Darwin",
        "Population": 120900
    },
    {
        "Annual Rainfall": 619.5,
        "Area": 1357,
        "City name": "Hobart",
        "Population": 205556
    },
    {
        "Annual Rainfall": 1214.8,
        "Area": 2058,
        "City name": "Sydney",
        "Population": 4336374
    },
    {
        "Annual Rainfall": 646.9,
        "Area": 1566,
        "City name": "Melbourne",
        "Population": 3806092
    },
    {
        "Annual Rainfall": 869.4,
        "Area": 5386,
        "City name": "Perth",
        "Population": 1554769
    }
]
"""

選擇性輸出

例子還是這個

+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+

引數

上面那幾個方法的引數都差不多,這裡就以預設的 get_string() 的方法引數為例

  • title - 可選的表格標題
  • start - 包含在輸出中的第一個資料行的索引
  • end - 包含在輸出中的最後一個資料行的索引加一(列表切片風格)
  • fields - 要包含的欄位(列)的名稱
  • header - 列印顯示欄位名稱的標題(True或False)
  • border - 在表格周圍列印邊框(True或False)
  • preserve_internal_border - 即使禁用border,也在表格內部列印邊框(True或False)
  • hrules - 控制行後列印水平線的規則。允許的值:ALL, FRAME, HEADER, NONE
  • vrules - 控制列之間列印垂直線的規則。允許的值:FRAME, ALL, NONE
  • int_format - 控制整數資料的格式化
  • float_format - 控制浮點資料的格式化
  • custom_format - 使用可呼叫物件控制任何列的格式化
  • padding_width - 列資料兩側的空格數(僅在左右填充為None時使用)
  • left_padding_width - 列資料左側的空格數
  • right_padding_width - 列資料右側的空格數
  • vertical_char - 用於繪製垂直線的單個字元字串
  • horizontal_char - 用於繪製水平線的單個字元字串
  • horizontal_align_char - 用於表示對齊的單個字元字串
  • junction_char - 用於繪製線交匯點的單個字元字串
  • top_junction_char - 用於繪製頂部線交匯點的單個字元字串
  • bottom_junction_char - 用於繪製底部線交匯點的單個字元字串
  • right_junction_char - 用於繪製右側線交匯點的單個字元字串
  • left_junction_char - 用於繪製左側線交匯點的單個字元字串
  • top_right_junction_char - 用於繪製右上角線交匯點的單個字元字串
  • top_left_junction_char - 用於繪製左上角線交匯點的單個字元字串
  • bottom_right_junction_char - 用於繪製右下角線交匯點的單個字元字串
  • bottom_left_junction_char - 用於繪製左下角線交匯點的單個字元字串
  • sortby - 按此欄位名稱對行進行排序
  • sort_key - 排序鍵函式,在排序之前應用於資料點
  • reversesort - True或False以降序或升序排序

下面舉一些比較常用的例子

輸出指定的列

當我們只需要 City name 列和 Population 列的時候

print(table.get_string(fields=["City name", "Population"]))

"""
輸出
+-----------+------------+
| City name | Population |
+-----------+------------+
|  Adelaide |  1158259   |
|  Brisbane |  1857594   |
|   Darwin  |   120900   |
|   Hobart  |   205556   |
|   Sydney  |  4336374   |
| Melbourne |  3806092   |
|   Perth   |  1554769   |
+-----------+------------+
"""

指定輸出的行

只輸出第三行到第五行

print(table.get_string(start = 2, end = 4))
# 或者透過切片的方式
print(table[2:4])
"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
+-----------+------+------------+-----------------+
"""

排序

當我們需要排序後輸出的時候

# 升序
print(table.get_string(sortby="Population"))
"""
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|  Adelaide | 1295 |  1158259   |      600.5      |
|   Perth   | 5386 |  1554769   |      869.4      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
+-----------+------+------------+-----------------+
"""
# 降序
print(table.get_string(sortby="Population", reversesort=True))
"""
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Perth   | 5386 |  1554769   |      869.4      |
|  Adelaide | 1295 |  1158259   |      600.5      |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Darwin  | 112  |   120900   |      1714.7     |
+-----------+------+------------+-----------------+
"""

為表新增個標題

print(table.get_string(title="Australian Capital Territories by area"))
"""
輸出
+-------------------------------------------------+
|      Australian Capital Territories by area     |
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+
"""

讀取檔案

從CSV檔案讀入資料

test.cvs檔案

from prettytable import from_csv

with open("test.csv") as fp:
    table = from_csv(fp)

print(table)

"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
+-----------+------+------------+-----------------+
"""

從資料庫中讀取資料

如果表資料在資料庫中,則可以訪問該資料庫獲取資料,然後將獲取資料之後的遊標物件構建一個 PrettyTable,

例如從mysql中讀取資料

import pymysql
from prettytable import from_db_cursor

conn = None
curses = None
try:
    conn = pymysql.connect(
        user = 'root',
        passwd = '111111',
        host = '10.0.0.200',
        port = 3306,
        db = 'codebox',
        charset = 'utf8'
    )  # 新建連線
    curses = conn.cursor()  # 新建遊標,類似指標
    sql = """select * from test"""
    # 列印sql語句
    print(curses.mogrify(sql))
    curses.execute(sql)  # 執行sql語句
    # 列印結果,以表格的形式
    print(from_db_cursor(curses))
    """
    +----+-------+-----+--------+
    | id |  name | age | gender |
    +----+-------+-----+--------+
    | 1  | user1 |  17 |   0    |
    | 2  | user2 |  50 |   1    |
    | 3  | user3 |  22 |   1    |
    | 4  | user4 |  33 |   0    |
    +----+-------+-----+--------+
    """
except Exception as e:
    print(e)
finally:
    if curses:
        curses.close()  # 關閉遊標
    if conn:
        conn.close()  # 關閉連線

sqlite也類似

import sqlite3
from prettytable import from_db_cursor

connection = sqlite3.connect("mydb.db")
cursor = connection.cursor()
cursor.execute("SELECT field1, field2, field3 FROM my_table")
print(from_db_cursor(curses))

從HTML匯入資料

from prettytable import from_html

html_string = '''<table>
<tr>
<th>code</th>
<th>uuid</th>
<th>name</th>
<th>IP</th>
</tr>
<tr>
<td>1</td>
<td>server01</td>
<td>server-01</td>
<td>192.168.100.1</td>
</tr>
<tr>
<td>2</td>
<td>server02</td>
<td>server-02</td>
<td>192.168.100.2</td>
</tr>
</table>'''

table = from_html(html_string)
print(table[0])

"""
輸出
+------+----------+-----------+---------------+
| code |   uuid   |    name   |       IP      |
+------+----------+-----------+---------------+
|  1   | server01 | server-01 | 192.168.100.1 |
|  2   | server02 | server-02 | 192.168.100.2 |
+------+----------+-----------+---------------+
"""

刪除表資料

rettytable提供四種方法用於刪除資料:

  • del_row() :刪除某行,允許傳入一個整數引數,(從0開始)。
  • del_column() :刪除某列,允許傳入一個字串,表示要刪除的列的欄位名。
  • clear_rows() :刪除所有資料,但儲存列的欄位名。
  • clear() :刪除所有資料,包括列的欄位名。

樣式

PrettyTable 具有許多樣式選項,用於控制表格的各個方面顯示。可以自由地單獨設定每個選項。
set_style() 方法只是自動為您執行此操作。

用 set_style 方法設定一些預定義好的樣式

可以設定的選項

  • DEFAULT - 預設外觀,用於撤銷您可能所做的任何樣式更改
  • MARKDOWN - 以 Markdown 格式列印表格
  • PLAIN_COLUMNS - 無邊框樣式,適用於命令列程式的列資料
  • MSWORD_FRIENDLY - 與Microsoft Word的“轉換為表格”功能配合良好的格式
  • ORGMODE - 適合Org模式語法的表格樣式
  • SINGLE_BORDER 和 DOUBLE_BORDER - 使用連續的單/雙線邊框和Box繪製字元的樣式,以便在終端上更精美的顯示

其他樣式可能會在未來的版本中出現。

示例

以markdown形式輸出

from prettytable import MARKDOWN

table.set_style(MARKDOWN)
# from prettytable import PLAIN_COLUMNS
# table.set_style(PLAIN_COLUMNS)
# 輸出格式化後的表格
print(table)
"""
輸出
| City name | Area | Population | Annual Rainfall |
| :-------: | :--: | :--------: | :-------------: |
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
"""

以PLAIN_COLUMNS形式輸出

from prettytable import PLAIN_COLUMNS

table.set_style(PLAIN_COLUMNS)
# 輸出格式化後的表格
print(table)
"""
輸出
City name        Area        Population        Annual Rainfall        
 Adelaide        1295         1158259               600.5             
 Brisbane        5905         1857594               1146.4            
  Darwin         112           120900               1714.7            
  Hobart         1357          205556               619.5             
  Sydney         2058         4336374               1214.8            
Melbourne        1566         3806092               646.9             
  Perth          5386         1554769               869.4 
"""

以 MSWORD_FRIENDLY 形式輸出

from prettytable import MSWORD_FRIENDLY

table.set_style(MSWORD_FRIENDLY)
# 輸出格式化後的表格
print(table)
"""
輸出
| City name | Area | Population | Annual Rainfall |
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
"""

以 ORGMODE 形式輸出

from prettytable import ORGMODE

table.set_style(ORGMODE)
# 輸出格式化後的表格
print(table)
"""
輸出
|-----------+------+------------+-----------------|
| City name | Area | Population | Annual Rainfall |
|-----------+------+------------+-----------------|
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
|   Darwin  | 112  |   120900   |      1714.7     |
|   Hobart  | 1357 |   205556   |      619.5      |
|   Sydney  | 2058 |  4336374   |      1214.8     |
| Melbourne | 1566 |  3806092   |      646.9      |
|   Perth   | 5386 |  1554769   |      869.4      |
|-----------+------+------------+-----------------|
"""

樣式引數

選項 詳情
border 布林選項(必須為True或False)。
控制是否在表格內部和周圍繪製邊框。
preserve_internal_border 布林選項(必須為True或False)。
控制當border=False時,是否仍在表格內繪製邊框。
header 布林選項(必須為True或False)。
控制表格的第一行是否為顯示所有欄位名稱的標題行。
hrules 控制在行後列印水平線的規則。
允許的值:FRAME, HEADER, ALL, NONE。
HEADER, ALL, NONE 這些是在prettytable模組內部定義的變數,因此請確保匯入它們或使用prettytable.FRAME等。
vrules 控制在列之間列印垂直線的規則。
允許的值:FRAME, ALL, NONE。
int_format 控制整數資料列印方式的字串。
工作方式類似於:print("%<int_format>d" % data)。
float_format 控制浮點數資料列印方式的字串。
工作方式類似於:print("%<float_format>f" % data)。
custom_format 欄位和可呼叫物件的字典。這允許您設定任何您想要的格式
例如:pf.custom_format["my_col_int"] = lambda f, v: f"{v:,}"
可呼叫物件的型別為Callable[[str, Any], str]
padding_width 列資料兩側的空格數(僅在左右填充為None時使用)。
left_padding_width 列資料左側的空格數。
right_padding_width 列資料右側的空格數。
vertical_char 用於繪製垂直線的單個字元字串。
預設值:|。
horizontal_char 用於繪製水平線的單個字元字串。
預設值:-。
_horizontal_align_char 用於表示水平線中列對齊的單個字元字串。
預設值:對於Markdown為:,否則為None。
junction_char 用於繪製線交匯點的單個字元字串。
預設值:+。
top_junction_char 用於繪製頂部線交匯點的單個字元字串。
預設值:junction_char。
bottom_junction_char 用於繪製底部線交匯點的單個字元字串。
預設值:junction_char。
right_junction_char 用於繪製右側線交匯點的單個字元字串。
預設值:junction_char。
left_junction_char 用於繪製左側線交匯點的單個字元字串。
預設值:junction_char。
top_right_junction_char 用於繪製右上角線交匯點的單個字元字串。
預設值:junction_char。
top_left_junction_char 用於繪製左上角線交匯點的單個字元字串。
預設值:junction_char。
bottom_right_junction_char 用於繪製右下角線交匯點的單個字元字串。
預設值:junction_char。
bottom_left_junction_char 用於繪製左下角線交匯點的單個字元字串。
預設值:junction_char。

邊框

設定邊框是否有
table.border = False
# 輸出格式化後的表格
print(table)

# 或者
print(table.get_string(border = False))
"""
輸出
 City name  Area  Population  Annual Rainfall 
  Adelaide  1295   1158259         600.5      
  Brisbane  5905   1857594         1146.4     
   Darwin   112     120900         1714.7     
   Hobart   1357    205556         619.5      
   Sydney   2058   4336374         1214.8     
 Melbourne  1566   3806092         646.9      
   Perth    5386   1554769         869.4 
"""
設定邊框樣式
# 是否顯示邊框,預設為True
table.border = True
# 橫邊框
table.horizontal_char = '^'
# 豎邊框
table.vertical_char = '>'
# 邊框連線符
table.junction_char = '~'
# 輸出格式化後的表格
print(table)
"""
輸出
~^^^^^^^^^^^~^^^^^^~^^^^^^^^^^^^~^^^^^^^^^^^^^^^^^~
> City name > Area > Population > Annual Rainfall >
~^^^^^^^^^^^~^^^^^^~^^^^^^^^^^^^~^^^^^^^^^^^^^^^^^~
>  Adelaide > 1295 >  1158259   >      600.5      >
>  Brisbane > 5905 >  1857594   >      1146.4     >
>   Darwin  > 112  >   120900   >      1714.7     >
>   Hobart  > 1357 >   205556   >      619.5      >
>   Sydney  > 2058 >  4336374   >      1214.8     >
> Melbourne > 1566 >  3806092   >      646.9      >
>   Perth   > 5386 >  1554769   >      869.4      >
~^^^^^^^^^^^~^^^^^^~^^^^^^^^^^^^~^^^^^^^^^^^^^^^^^~
"""

表頭

table.header = False
# 輸出格式化後的表格
print(table)

# 或者
print(table.get_string(header = False))
"""
+-----------+------+---------+--------+
|  Adelaide | 1295 | 1158259 | 600.5  |
|  Brisbane | 5905 | 1857594 | 1146.4 |
|   Darwin  | 112  |  120900 | 1714.7 |
|   Hobart  | 1357 |  205556 | 619.5  |
|   Sydney  | 2058 | 4336374 | 1214.8 |
| Melbourne | 1566 | 3806092 | 646.9  |
|   Perth   | 5386 | 1554769 | 869.4  |
+-----------+------+---------+--------+
"""

對齊方式

可以透過將單字元字串分配給 align 屬性來更改表格中列的對齊方式。
允許的字串分別為lrc,分別代表左對齊、右對齊和居中對齊

預設引數就是居中對齊

分兩種

  • 所有列修改相同的
  • 每一列修改各自的
所有列都相同的

以左對齊為例

table.align = "l"
# 輸出格式化後的表格
print(table)
"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Adelaide  | 1295 | 1158259    | 600.5           |
| Brisbane  | 5905 | 1857594    | 1146.4          |
| Darwin    | 112  | 120900     | 1714.7          |
| Hobart    | 1357 | 205556     | 619.5           |
| Sydney    | 2058 | 4336374    | 1214.8          |
| Melbourne | 1566 | 3806092    | 646.9           |
| Perth     | 5386 | 1554769    | 869.4           |
+-----------+------+------------+-----------------+
"""
每列單獨修改
table.align["City name"] = "l"
table.align["Area"] = "c"
table.align["Population"] = "r"
table.align["Annual Rainfall"] = "c"
# 輸出格式化後的表格
print(table)
"""
輸出
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Adelaide  | 1295 |    1158259 |      600.5      |
| Brisbane  | 5905 |    1857594 |      1146.4     |
| Darwin    | 112  |     120900 |      1714.7     |
| Hobart    | 1357 |     205556 |      619.5      |
| Sydney    | 2058 |    4336374 |      1214.8     |
| Melbourne | 1566 |    3806092 |      646.9      |
| Perth     | 5386 |    1554769 |      869.4      |
+-----------+------+------------+-----------------+
"""

使用帶顏色的表格

例子

from prettytable.colortable import ColorTable, Themes

table = ColorTable(theme=Themes.OCEAN)

print(table)

內建的只有兩個主題 DEFAULT 和 OCEAN

也可以自己寫

可以仿照原始碼中的寫

class Themes:
    DEFAULT = Theme()
    OCEAN = Theme(
        default_color="96",
        vertical_color="34",
        horizontal_color="34",
        junction_color="36",
    )

引數部分

引數 描述
default_color 作為預設使用的顏色
vertical_charhorizontal_charjunction_char 用於建立表格輪廓的字元
vertical_colorhorizontal_colorjunction_color 用於設定每個字元樣式的顏色

注意:顏色使用 Theme.format_code(s: str) 函式進行格式化。
該函式接受一個字串。如果字串以轉義碼開頭(如 \x1b),則返回給定字串。
如果字串僅包含空格,則返回空字串 ""。如果字串是數字(如 "34"),則會自動將其格式化為轉義碼。

總結

PrettyTable是一個簡單而實用的庫,但它並不是一個專門用於處理大型資料集的工具。以下是PrettyTable的一些缺點:

  • 效能限制:當處理大量資料時,PrettyTable的效能可能有限。它在處理大型資料集時可能會變得緩慢,並消耗大量的記憶體資源。如果需要處理大規模的資料集,使用其他更為高效的庫會更合適。
  • 靈活性不足:PrettyTable相對簡單,功能相對較少,提供的功能有一定限制。它不支援對錶格進行復雜的操作,例如合併單元格、複雜排序、過濾等。如果需要更高階的表格處理功能,可能需要使用其他庫或者自行實現。
  • 匯出格式有限:PrettyTable的主要目的是在命令列中列印表格。它支援將表格匯出為ASCII格式或HTML格式,但在更復雜的用例中,可能需要支援更多匯出格式,例如Excel、CSV等。如果需要儲存表格為不同的檔案格式,可能需要額外的轉換步驟。

相關文章