Python实用库--PrettyTable

简介

PrettyTable是一个强大的Python第三方库,专门设计用于从程序中生成美观、易于阅读的ASCII格式表格。

在数据分析、命令行工具开发、脚本编写等领域中,特别是在需要直观呈现数据而又不依赖图形界面的情况下,PrettyTable库显得尤为实用。

其设计灵感来源于PostgreSQL的psql工具中所使用的ASCII表格风格,为用户提供了一种简洁而灵活的方式来组织和呈现数据。

它的slogan就是 “以美观的 ASCII 表格格式显示表格数据”

官网

安装

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等。如果需要保存表格为不同的文件格式,可能需要额外的转换步骤。
posted @ 2024-06-16 01:53  厚礼蝎  阅读(191)  评论(0编辑  收藏  举报