Python表格美化库PrettyTable中文文档




简介

PrettyTable的设计目的是输出美观的数据表格,它的灵感来自于PostgreSQL shell psql

PrettyTable功能:

  1. 选择要打印的列
  2. 列的独立对齐(左中右)
  3. 指定行范围打印子表




安装

pip install prettytable




按行添加

先指定字段名field_names,再调用add_row()

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)
+-----------+------+------------+-----------------+
| 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

x = PrettyTable()
x.add_column("City name", ["Adelaide", "Brisbane", "Darwin", "Hobart", "Sydney", "Melbourne", "Perth"])
x.add_column("Area", [1295, 5905, 112, 1357, 2058, 1566, 5386])
x.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769])
x.add_column("Annual Rainfall", [600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, 869.4])
print(x)
+-----------+------+------------+-----------------+
| 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      |
+-----------+------+------------+-----------------+

PS:可以混合使用add_row()add_column(),但最好不要这样做。




从CSV导入

调用from_csv()

a.csv

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 import from_csv

with open("a.csv") as f:
    x = from_csv(f)
    print(x)
+-----------+------+------------+-----------------+
| 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_db_cursor(),传入对应数据库的Python DB-API

以SQLite为例:

import os
import sqlite3
from prettytable import from_db_cursor

database = "a.db"

# 创建SQLite数据库
if os.path.exists(database):
    os.remove(database)
connection = sqlite3.connect(database)
cursor = connection.cursor()
cursor.execute("""CREATE TABLE 'city' ('City name' text, 'Area' text, 'Population' text, 'Annual Rainfall' text)""")
cursor.execute("INSERT INTO 'city' VALUES ('Adelaide','1295','1158259','600.5')")
cursor.execute("INSERT INTO 'city' VALUES ('Brisbane','5905','1857594','1146.4')")
cursor.execute("INSERT INTO 'city' VALUES ('Darwin','112','120900','1714.7')")
cursor.execute("INSERT INTO 'city' VALUES ('Hobart','1357','205556','619.5')")
cursor.execute("INSERT INTO 'city' VALUES ('Sydney','2058','4336374','1214.8')")
cursor.execute("INSERT INTO 'city' VALUES ('Melbourne','1566','3806092','646.9')")
cursor.execute("INSERT INTO 'city' VALUES ('Perth','5386','1554769','869.4')")
connection.commit()
connection.close()

# 从数据库导入
connection = sqlite3.connect(database)
cursor = connection.cursor()
cursor.execute("SELECT * FROM 'city'")
x = from_db_cursor(cursor)
print(x)
+-----------+------+------------+-----------------+
| 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      |
+-----------+------+------------+-----------------+




删除数据

按删除程度递增分三种:

  • del_row():删除某行
  • clear_rows():清空数据,保留字段名
  • clear():清空所有数据
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])
print(x)

# 删除某行
x.del_row(0)
print(x)

# 清空数据,保留字段名
x.clear_rows()
print(x)

# 清空所有数据
x.clear()
print(x)
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
+-----------+------+------------+-----------------+

+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Brisbane | 5905 |  1857594   |      1146.4     |
+-----------+------+------------+-----------------+

+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
+-----------+------+------------+-----------------+

++
||
++
++




转换为字符串

调用get_string()

参数:

  • start:起始索引
  • end:结束索引
  • fields:指定字段
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])
print(x.get_string())
print(x.get_string(fields=["City name", "Population"]))  # 指定字段
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |
+-----------+------+------------+-----------------+
+-----------+------------+
| City name | Population |
+-----------+------------+
|  Adelaide |  1158259   |
|  Brisbane |  1857594   |
+-----------+------------+




转换为HTML

调用get_html_string(),可通过fields=[]指定字段

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])
print(x.get_html_string())
# print(x.get_string(fields=["City name", "Population"]))  # 指定字段
<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>
</table>

需要对齐等属性生效,需要加多一句

x.format = True




对齐方式

全局对齐

指定属性align

  • l:居左
  • r:居右
  • c:居中
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.align = "r"  # l居左 r居右 c居中
print(x)
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
|  Adelaide | 1295 |    1158259 |           600.5 |
|  Brisbane | 5905 |    1857594 |          1146.4 |
+-----------+------+------------+-----------------+

局部对齐

指定属性align[列名]

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.align["City name"] = "l"
x.align["Area"] = "c"
x.align["Population"] = "r"
x.align["Annual Rainfall"] = "c"
print(x)
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Adelaide  | 1295 |    1158259 |      600.5      |
| Brisbane  | 5905 |    1857594 |      1146.4     |
+-----------+------+------------+-----------------+




排序

根据字段名

调用get_string(),指定参数sortby=某字段名

默认顺序,倒序则指定参数reversesort=True

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.get_string(sortby="Population"))
print(x.get_string(sortby="Population", reversesort=True))  # 倒序
+-----------+------+------------+-----------------+
| 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     |
+-----------+------+------------+-----------------+

自定义排序

调用get_string(),指定参数sortby=某函数名

请自行阅读文档




改变样式

预设样式

调用set_style()

预设样式类型:

  • MSWORD_FRIENDLY:配合微软Word的“转换为表格”功能
  • PLAIN_COLUMNS:无边界样式,适合柱状数据
from prettytable import PrettyTable
from prettytable import MSWORD_FRIENDLY, PLAIN_COLUMNS

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.set_style(MSWORD_FRIENDLY)  # 配合微软Word的“转换为表格”功能
print(x)
x.set_style(PLAIN_COLUMNS)  # 无边界样式,适合柱状数据
print(x)
| City name | Area | Population | Annual Rainfall |
|  Adelaide | 1295 |  1158259   |      600.5      |
|  Brisbane | 5905 |  1857594   |      1146.4     |

City name        Area        Population        Annual Rainfall        
 Adelaide        1295         1158259               600.5             
 Brisbane        5905         1857594               1146.4   

自定义样式

设置方法:

  • 全局1:x = PrettyTable(border=False, header=False, padding_width=5)
  • 全局2:x.border=False
  • 临时:调用get_string()get_html_string()时指定

参数:

  • header:是否打印字段名
  • border:是否打印边界
  • hrules:水平打印的规则
  • vrules:垂直打印的规则
  • int_format:整数打印的规则
  • float_format:浮点数打印的规则
  • padding_width:数据两边的空格数
  • left_padding_width:数据左边的空格数
  • right_padding_width:数据右边的空格数
  • vertical_char:垂直线字符,默认为|
  • horizontal_char:水平线字符,默认为-
  • junction_char:连接线字符,默认为+

具体使用查看文档




参考文献

  1. PrettyTable文档
  2. PTable文档
  3. prettytable
  4. Psql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XerCis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值