PrettyTable
最后修改于 2024 年 1 月 29 日
本文介绍了如何使用 Python PrettyTable 模块在 Python 中生成 ASCII 表格。在本文中,我们使用 PTable 模块,它是原始 PrettyTable 库的一个分支。
PrettyTable
PrettyTable 是一个用于生成简单 ASCII 表格的 Python 库。它的灵感来自于 PostgreSQL shell psql 中使用的 ASCII 表格。 我们可以控制表格的许多方面,例如列填充的宽度、文本的对齐方式或表格边框。 我们可以对数据进行排序。
我们还可以选择哪些列和行将显示在最终输出中。 PrettyTable 可以从 CSV、HTML 或数据库游标读取数据,并以 ASCII 或 HTML 格式输出数据。
PrettyTable 安装
$ pip install prettytable
我们使用 pip
工具安装该模块。
生成 PrettyTable
可以使用 add_row
或 add_column
方法创建表格。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable() x.field_names = ["City name", "Area", "Population", "Annual Rainfall"] x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x)
该示例使用 add_row
方法创建一个 PrettyTable。
from prettytable import PrettyTable
我们从模块中导入 PrettyTable
。
x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
我们设置表头名称。
x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4])
使用 add_row
将行添加到表格中。
print(x)
最后,我们将表格打印到控制台。
$ ./create_by_row.py +-----------+------+------------+-----------------+ | 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
方法创建相同的表格。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable() column_names = ["City name", "Area", "Population", "Annual Rainfall"] x.add_column(column_names[0], ["Adelaide", "Brisbane", "Darwin", "Hobart", "Sydney", "Melbourne", "Perth"]) x.add_column(column_names[1], [1295, 5905, 112, 1357, 2058, 1566, 5386 ]) x.add_column(column_names[2], [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769]) x.add_column(column_names[3], [600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, 869.4]) print(x)
列名是 add_column
方法的第一个参数。
PrettyTable 删除行
使用 del_row
可以删除特定的行。该方法采用要删除的行的索引。 请注意,索引从零开始。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable() x.field_names = ["City name", "Area", "Population", "Annual Rainfall"] x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) x.del_row(6) x.del_row(5) x.del_row(4) x.del_row(3) print(x)
在此示例中,我们删除最后四行。
$ ./delete_rows.py +-----------+------+------------+-----------------+ | City name | Area | Population | Annual Rainfall | +-----------+------+------------+-----------------+ | Adelaide | 1295 | 1158259 | 600.5 | | Brisbane | 5905 | 1857594 | 1146.4 | | Darwin | 112 | 120900 | 1714.7 | +-----------+------+------------+-----------------+
前三行保留在输出中。
PrettyTable 清除数据
clear_rows
方法删除表格中的所有行,但保留当前的列名。 clear
方法清除行和列名。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable() x.field_names = ["City name", "Area", "Population", "Annual Rainfall"] x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) x.clear_rows() print(x)
该示例清除表格中的所有行。
$ ./clear_rows.py +-----------+------+------------+-----------------+ | City name | Area | Population | Annual Rainfall | +-----------+------+------------+-----------------+ +-----------+------+------------+-----------------+
这是示例的输出。 表格的标题未被删除。
从 CSV 生成 PrettyTable
from_csv
方法可用于从 CSV 数据生成 PrettyTable。
"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
data.csv
包含以逗号字符分隔的数据。 请注意,第一行由表格列名组成。
#!/usr/bin/python from prettytable import from_csv with open("data.csv", "r") as fp: x = from_csv(fp) print(x)
该示例从 data.csv
读取数据,并使用 from_csv
从其生成 PrettyTable。
从数据库游标生成 PrettyTable
from_db_cursor
方法从数据库游标生成 PrettyTable。
DROP TABLE IF EXISTS Cities; CREATE TABLE Cities(Id INTEGER PRIMARY KEY, Name TEXT, Area INTEGER, Population INTEGER, Rainfall REAL); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Adelaide", 1295, 1158259, 600.5); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Brisbane", 5905, 1857594, 1146.4); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Darwin", 112, 120900, 1714.7); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Hobart", 1357, 205556, 619.5); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Sydney", 2058, 4336374, 1214.8); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Melbourne", 1566, 3806092, 646.9); INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Perth", 5386, 1554769, 869.4);
这是在 SQLite 数据库中创建 Cities
表的 SQL 脚本。
$ sqlite3 data.db sqlite> .read cities.sql sqlite> SELECT * FROM Cities; Id Name Area Population Rainfall ---------- ---------- ---------- ---------- ---------- 1 Adelaide 1295 1158259 600.5 2 Brisbane 5905 1857594 1146.4 3 Darwin 112 120900 1714.7 4 Hobart 1357 205556 619.5 5 Sydney 2058 4336374 1214.8 6 Melbourne 1566 3806092 646.9 7 Perth 5386 1554769 869.4
我们读取生成数据库表的 cities.sql
脚本。
#!/usr/bin/python import sqlite3 as lite from prettytable import from_db_cursor con = lite.connect('data.db') with con: cur = con.cursor() cur.execute('SELECT * FROM Cities') x = from_db_cursor(cur) print(x)
在此代码示例中,我们连接到 data.db
数据库并从 Cities
表中选择所有数据。 我们使用 from_db_cursor
方法从游标生成 PrettyTable。
从 HTML 生成 PrettyTable
from_html
从 HTML 代码字符串生成 PrettyTable 列表。 HTML 中的每个 <table>
都会成为一个 PrettyTable 对象。 from_html_one
从仅包含单个 <table>
的 HTML 代码字符串生成 PrettyTable。
<html> <body> <table> <tr> <th>City name</th> <th>Area</th> <th>Population</th> <th>Annual Rainfall</th> </tr> <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> </table> </body> </html>
在此示例中,我们使用此 HTML 文件。
#!/usr/bin/python from prettytable import from_html_one with open("data.html", "r") as fp: html = fp.read() x = from_html_one(html) print(x)
该示例从 data.html
文件读取数据,并使用 from_html_one
方法生成 PrettyTable。
数据排序
使用 sortby
属性,我们指定要排序的列。 reversesort
属性控制排序方向(升序与降序)。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable() x.field_names = ["City name", "Area", "Population", "Annual Rainfall"] x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print("Table sorted by population:") x.sortby = "Population" print(x) print() print("Table sorted by city in descendig order:") x.sortby = "City name" x.reversesort = True print(x)
在此示例中,我们对表格的数据进行排序。
print("Table sorted by population:") x.sortby = "Population"
首先,我们按人口升序对数据进行排序。
x.sortby = "City name" x.reversesort = True
然后,我们按城市名称降序对数据进行排序。
$ ./sorting.py Table sorted by 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 | +-----------+------+------------+-----------------+ Table sorted by city in descendig order: +-----------+------+------------+-----------------+ | City name | Area | Population | Annual Rainfall | +-----------+------+------------+-----------------+ | Sydney | 2058 | 4336374 | 1214.8 | | Perth | 5386 | 1554769 | 869.4 | | Melbourne | 1566 | 3806092 | 646.9 | | Hobart | 1357 | 205556 | 619.5 | | Darwin | 112 | 120900 | 1714.7 | | Brisbane | 5905 | 1857594 | 1146.4 | | Adelaide | 1295 | 1158259 | 600.5 | +-----------+------+------------+-----------------+
数据对齐
align
属性控制字段的对齐方式。 可能的值为 l
、c
和 r
。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable() x.field_names = ["City name", "Area", "Population", "Annual Rainfall"] x.align["City name"] = "l" x.align["Area"] = "r" x.align["Annual Rainfall"] = "r" x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x)
此代码示例对齐表列中的数据。
x.align["City name"] = "l"
我们将“城市名称”列中的字段与左对齐。
x.align["Area"] = "r" x.align["Annual Rainfall"] = "r"
我们将“面积”和“年降雨量”中的字段与右对齐。
$ ./alignment.py +-----------+------+------------+-----------------+ | 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 输出
get_html_string
从 PrettyTable 生成 HTML 输出。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) x.add_row(["Adelaide",1295, 1158259, 600.5]) x.add_row(["Brisbane",5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x.get_html_string())
此示例将 HTML 表格中的数据打印到控制台。
get_string 方法
get_string
方法返回当前状态下表格的字符串表示形式。 它有几个选项可以控制表格的显示方式。
显示标题
使用 title
参数,我们可以在输出中包含表格标题。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) x.add_row(["Adelaide",1295, 1158259, 600.5]) x.add_row(["Brisbane",5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x.get_string(title="Australian cities"))
此示例创建一个带有标题的 PrettyTable。
$ ./table_title.py +-------------------------------------------------+ | Australian cities | +-----------+------+------------+-----------------+ | 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 | +-----------+------+------------+-----------------+
选择列
使用 fields
选项,我们可以选择要显示的列。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) x.add_row(["Adelaide",1295, 1158259, 600.5]) x.add_row(["Brisbane",5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x.get_string(fields=["City name", "Population"]))
在此示例中,我们仅显示“城市名称”和“人口”列。
$ ./select_columns.py +-----------+------------+ | City name | Population | +-----------+------------+ | Adelaide | 1158259 | | Brisbane | 1857594 | | Darwin | 120900 | | Hobart | 205556 | | Sydney | 4336374 | | Melbourne | 3806092 | | Perth | 1554769 | +-----------+------------+
选择行
使用 start
和 end
参数,我们可以选择要在输出中显示的行。
#!/usr/bin/python from prettytable import PrettyTable x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) x.add_row(["Adelaide",1295, 1158259, 600.5]) x.add_row(["Brisbane",5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x.get_string(start=1, end=4))
在此示例中,我们仅在输出中包含三行。
$ ./select_rows.py +-----------+------+------------+-----------------+ | City name | Area | Population | Annual Rainfall | +-----------+------+------------+-----------------+ | Brisbane | 5905 | 1857594 | 1146.4 | | Darwin | 112 | 120900 | 1714.7 | | Hobart | 1357 | 205556 | 619.5 | +-----------+------+------------+-----------------+
显示 BTC 交易代码
在下一个示例中,我们在表格中显示 BTC 价格。 为了获取数据,我们使用 ccxt
模块。 数据是从 Binance 交易所获取的。
#!/usr/bin/python import asyncio from datetime import datetime import ccxt.async_support as ccxt from prettytable import PrettyTable async def tickers(): binance = ccxt.binance() data = await binance.fetch_ohlcv('BTC/USDT', '1d', limit=10) await binance.close() x = PrettyTable() x.field_names = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume'] x.align['Volume'] = 'r' for e in data: d = datetime.utcfromtimestamp(e[0]/1000.0) x.add_row([f'{d:%m/%d/%Y}', f'{e[1]:.2f}', f'{e[2]:.2f}', f'{e[3]:.2f}', f'{e[4]:.2f}', f'{e[5]:.5f}']) print(x) asyncio.run(tickers())
此示例显示过去十天的 BTC 的开盘价、最高价、最低价、收盘价数据。
x = PrettyTable() x.field_names = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume'] x.align['Volume'] = 'r'
我们有日期和 OHLCV 值。 最后一列是右对齐的。
$ ./btc_ohlcv.py +------------+----------+----------+----------+----------+--------------+ | Date | Open | High | Low | Close | Volume | +------------+----------+----------+----------+----------+--------------+ | 03/17/2023 | 24998.78 | 27756.84 | 24890.00 | 27395.13 | 624460.68091 | | 03/18/2023 | 27395.13 | 27724.85 | 26578.00 | 26907.49 | 371238.97174 | | 03/19/2023 | 26907.49 | 28390.10 | 26827.22 | 27972.87 | 372066.99054 | | 03/20/2023 | 27972.87 | 28472.00 | 27124.47 | 27717.01 | 477378.23373 | | 03/21/2023 | 27717.01 | 28438.55 | 27303.10 | 28105.47 | 420929.74220 | | 03/22/2023 | 28107.81 | 28868.05 | 26601.80 | 27250.97 | 224113.41296 | | 03/23/2023 | 27250.97 | 28750.00 | 27105.00 | 28295.41 | 128649.60818 | | 03/24/2023 | 28295.42 | 28374.30 | 27000.00 | 27454.47 | 86242.06544 | | 03/25/2023 | 27454.46 | 27787.33 | 27156.09 | 27462.95 | 50844.08102 | | 03/26/2023 | 27462.96 | 28194.40 | 27417.76 | 27740.46 | 42069.06686 | +------------+----------+----------+----------+----------+--------------+
来源
在本文中,我们使用了 PrettyTable 库在 Python 中生成 ASCII 表格。
作者
列出所有 Python 教程。