简介
PrettyTable的设计目的是输出美观的数据表格,它的灵感来自于PostgreSQL shell psql
PrettyTable功能:
- 选择要打印的列
- 列的独立对齐(左中右)
- 指定行范围打印子表
安装
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
:连接线字符,默认为+