表格美化输出模块prettytable
本文约32000字。简单使用的话,仅阅读到3.3节 添加字段名和数据 即可。
1. 概述
- PrettyTable模块可以用来输出表格,就像excel、mysql查询出来的结果一样,方便查看数据的详情。
- 参考文档: https://pypi.org/project/prettytable/
2. 安装
3. 基本使用
3.1 创建表格
3.2 设置表格标题
此时不能直接输出x,输出的话会抛出异常
3.3 添加字段名和数据
此时打印
x
时,可以看到输出了一个表格,像从数据库查询的输出结果一样!!
3.4 一次添加多行数据
也可以使用
add_rows
一次性添加多行数据到表格中,示例如下:
运行后,结果如下:
3.5 按列添加数据
我们也可以按列的方式一列列的添加数据,此使用使用
add_column
方法,该方法第一个参数是字段名,第二参数是列数据组成的数组或元组。
运行结果如下:
可以看到,的确添加了两列数据。
-
注意,只能用
add_column
方法一次添加一列,不能使用add_columns
一次添加多列,没有该方法。 -
不要混合使用
add_column
和add_row
,这样有时会让人感觉困惑,更推荐使用add_row
或add_rows
一次添加一行或多行数据。
3.6 从csv文件读取数据
如我们创建一个
data.csv
文件
download data.csv
:
我们也可以使用prettytable读取csv文件中的数据:
运行后,输出如下:
输出效果如下图所示:
可以看到,可以正常从csv文件中读取到数据,并输出了表格。唯一美中不足的是,表格中存在中文,文本没有完全对齐。
在Iterm2中控制台输出显示是正常的:
在VSCODE中输出也是正常的!!
详细可参考 Better display of Chinese #49
3.7 从数据库导入数据
3.7.1 准备数据库数据
我们参考 https://www.runoob.com/sqlite/sqlite-insert.html 创建一个sqlite的表格。
创建db文件:
打开db文件:
创建表格:
向表格中插入数据:
操作后,检查输出:
3.7.2 导入数据
请看以下示例:
输出结果:
3.8 删除数据
-
del_row
:删除某行,允许传入一个整数参数,(从0开始)。 -
del_column
:删除某列,允许传入一个字符串,表示要删除的列的字段名。 -
clear_rows
:删除所有数据,但保留列的字段名。 -
clear
:删除所有数据,包括列的字段名。
我们以3.7节从数据库中读出的数据为例,来删除表格中的数据:
3.8.1
del_row
删除某行
删除第2行:
运行后输出如下:
可以看到,ID为2的行(也就是第2行数据)被正常删除了。
3.8.2
del_column
删除某列
删除
ADDRESS
列:
运行后,输出如下:
可以看到
ADDRESS
列被删除了。
3.8.3
clear_rows
删除所有数据行
删除所有数据行,但保留字段名:
运行后,输出如下:
可以看到,此时数据行的内容被清空了,仅保留了字段名行。
3.8.4
clear
删除所有行
注意,执行
clear
清理后,不能再打印mytable了,打印的话,会抛出异常
IndexError: list index out of range
。
3.9 多语言测试
以下在表格中插入日本地名的中文名称、平假名、英文等。
运行,输出结果如下:
可以看到,正常输出表格,说明支持中文、日文、英文的表格输出。
3.10 设置分界线
-
您可以使用
divider
参数将表划分为不同的部分。这将在设置了此字段的行下的表中添加一条分界线。
3.10.1 每行单独设置分隔线
我们来设置一下,看一下效果。
运行后,查看输出效果:
可以看到在
City name
为
Hobart
的下一行,多出了一个分割线,将表格分成了上下两部分,就像Excel表格里面的单元格的框线一样。
如果我想每行数据后面都有分隔线,则可以像下面这样做:
在每行数据中都加上
divider=True
参数:
运行后,输出如下:
可以看到,此时非常像Excel表格,每个单元格都有外边框!!!
3.10.2 默认每行都设置分隔线
我们也可以对
PrettyTable
类的
add_row
方法进行重写!
重写
add_row
方法,并创建表格:
此时,表格输出与上一节的结果相同!!
输出如下图所示:
其他方法如果也想默认都设置分隔线,则需要对父类方法进行重写,像
from_csv
,则也都需要对父类的
from_csv
方法进行重写。此处忽略。
3.11 改变默认样式
可以使用
set_style
方法来改变默认的输出样式。
其参数支持以下内置样式:
-
DEFAULT
, 默认样式,用于撤消您可能所做的任何样式更改。 -
MSWORD_FRIENDLY
, 电子文档模式。 -
PLAIN_COLUMNS
, 一种无边框样式,适用于柱状数据的命令行程序。 -
MARKDOWN
, 遵循 Markdown 语法的样式。 -
ORGMODE
, 适合Org 模式语法的表格样式。 -
SINGLE_BORDER
和DOUBLE_BORDER
, 使用带有方框图字符的连续单/双边框线的样式,以便在终端上进行更精美的显示。 -
RANDOM
, 随机模式,每一次打印都会在内置的样式中随机选择一个。
以3.6节天气数据为基础,此处参考官方文档修改表格样式。
3.11.1 默认样式
先回顾一下默认样式:
运行后效果图如下:
3.11.2 电子文档样式
运行后效果图如下:
可以看到,各行都没有横向的分隔线了。
3.11.3 无边框样式
运行后效果图如下:
此时可以看到,表格没有任何边框。
3.11.4 Markdown样式
也可以使用 Markdown 样式:
运行后效果图如下:
此时生成了MarkDown语法格式的表格输出,我们将字段名和数据行内容复制到此文档中粘贴,显示如下表所示:
序号 | 城市 | 日期 | 最低气温 | 最高气温 |
---|---|---|---|---|
1 | 北京 | 2023/4/30 | 11 | 25 |
2 | 上海 | 2023/4/30 | 15 | 24 |
3 | 深圳 | 2023/4/30 | 20 | 26 |
4 | 哈尔滨 | 2023/4/30 | 1 | 9 |
5 | 呼和浩特 | 2023/4/30 | 7 | 21 |
可以看到,展示了一个完整的表格。
3.11.5 ORG样式
不知道该样式是什么样的,测试看一下。
代码如下:
运行后效果图如下:
可以看到,表格左右两边转角处的
+
十字形没有了,都换成了
|
竖线。其他处与默认模式一样!
3.11.6 连续单、双框线
运行后效果图如下:
此时可以看到,连续单双框线时,表格框线都连接起来了,中间没有中断,这时候的输出更像Excel中的表格。
3.11.7 随机样式
可以使用
x.set_style(RANDOM)
来设置随机样式:
可以看到,运行了4次程序,4次输出的结果都不一样!!
3.12 表格对齐处理
- 默认情况下,表格每列都是居中对齐的。
- PrettyTable 实例的 align 属性控制列的对齐,可选的对齐方式有 "l"、"c" 和 "r",对应是left、center、right靠左对齐、居中对齐和靠右对齐。
3.12.1 默认对齐方式-居中对齐
默认情况下,各列使用居中对齐方式。请看示例:
运行后效果图如下:
3.12.2 一次设置所有列的对齐方式
可以使用以上代码将表格所有列都设置为右对齐。我们来测试一下:
运行后效果图如下:
3.12.3 单独控制每列对齐方式
通常情况下,我们需要单独控制每列的对齐方式,比如,有的列内容比较长,则不适合居中对齐,此时设置左对齐看起来更舒服。
运行后效果图如下:
可以看到
序号
、
最低气温
、
最高气温
三列是右对齐,
城市
列是左对齐,
日期
列是居中对齐。这样每列的对齐方式就单独控制了!!
3.13 排序
为了演示排序的效果,我们补充天气数据,并进行数据的排序。
以下是默认情况下,不进行排序的代码:
运行后效果图如下:
3.13.1 按指定字段名升序排序
在上一节代码的基础上,进行一些修改,按
最低气温
升序排序:
使用
x.sortby = '最低气温'
按
最低气温
升序排序。
运行后效果图如下:
3.13.2 按指定字段名降序排序
在上一节代码的基础上,进行一些修改,按
最低气温
降序排序:
默认情况下,排序是使用的升序排序,要想降序排序,则需要使用
x.reversesort = True
。
运行后效果图如下:
可以看到,最低气温的确是按从大到小降序排序的。
3.13.3 按多个字段进行排序
说明:本节是先对原始数据进行排序,然后直接将数据打印出来的。并没有用
x.sortby = '最低气温'
这样的方式进行排序。
为了演示排序效果,我们对天气数据进行扩充。多增加一些数据。
运行后效果图如下:
可以看到,
最低气温
列是从小到大升序排序的,然后当
最低气温
相同时,
最高气温
是按升序排序的。如
最低气温
为9时,
最高气温
是19在上、25在下,
最低气温
为20时,
最高气温
是26在上、29在下,说明也按
最高气温
升序排序了。
修改代码,先按最低气温升序,再按最高气温降序排序:
运行后效果图如下:
可以看到,
最低气温
列是从小到大升序排序的,然后当
最低气温
相同时,
最高气温
是按升序排序的。如
最低气温
为9时,
最高气温
是25在上、19在下,
最低气温
为20时,
最高气温
是29在上、26在下,说明按
最高气温
降序排序了。
3.14 输出格式化字符串
我们可以使用
get_string
、
get_csv_string
、
get_html_string
、
get_json_string
输出特殊格式的字符串,然后输出导文件中。
-
get_string
,原样输出表格对应的字符串。 -
get_csv_string
,输出csv类型字符串。 -
get_html_string
,输出html格式的字符串。 -
get_json_string
,输出json格式的字符串。
3.14.1 get_string原样输出表格
get_string可以原样输出表格对应的字符串,请看以下示例:
运行后效果图如下:
可以看到,
out_str
的类型是
str
字符串类型,其输出的效果与
print(x)
的效果一样。
下面我改一下代码,将格式化的字符写入到文件:
运行程序,并在控制台查看输入的文件
default.txt
,效果图如下:
可以看到,查看文件
default.txt
的内容,与
print(x)
的输出效果是一样的。
3.14.2 输出其他格式字符串
在上一节的基础上,我们分别输出html、json、csv格式的文件,运行后效果图如下:
3.15 更高级的样式配置
PrettyTable有许多样式选项,用于控制表格显示的各个方面。您可以自由地将这些选项中的每一个单独设置为您喜欢的任何选项。
set_style
方法会为你自动处理相关设置。
简单的改变表格样式可以参考 3.11节 改变默认样式。
以下是官方文档中给的的参数列表:
The options are these:
- border - A boolean option (must be True or False). Controls whether a border is drawn inside and around the table.
- preserve_internal_border - A boolean option (must be True or False). Controls whether borders are still drawn within the table even when border=False.
- header - A boolean option (must be True or False). Controls whether the first row of the table is a header showing the names of all the fields.
- hrules - Controls printing of horizontal rules after rows. Allowed values: FRAME, HEADER, ALL, NONE - note that these are variables defined inside the prettytable module so make sure you import them or use prettytable.FRAME etc.
- vrules - Controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE.
- int_format - A string which controls the way integer data is printed. This works like: print("%<int_format>d" % data)
- float_format - A string which controls the way floating point data is printed. This works like: print("%<float_format>f" % data)
- custom_format - A Dictionary of field and callable. This allows you to set any format you want pf.custom_format["my_col_int"] = ()lambda f, v: f"{v:,}". The type of the callable if callable[[str, Any], str]
- padding_width - Number of spaces on either side of column data (only used if left and right paddings are None).
- left_padding_width - Number of spaces on left-hand side of column data.
- right_padding_width - Number of spaces on right-hand side of column data.
- vertical_char - Single character string used to draw vertical lines. Default is |.
- horizontal_char - Single character string used to draw horizontal lines. Default is -.
- _horizontal_align_char - single character string used to indicate column alignment in horizontal lines. Default is : for Markdown, otherwise None.
- junction_char - Single character string used to draw line junctions. Default is +.
- top_junction_char - single character string used to draw top line junctions. Default is junction_char.
- bottom_junction_char - single character string used to draw bottom line junctions. Default is junction_char.
- right_junction_char - single character string used to draw right line junctions. Default is junction_char.
- left_junction_char - single character string used to draw left line junctions. Default is junction_char.
- top_right_junction_char - single character string used to draw top-right line junctions. Default is junction_char.
- top_left_junction_char - single character string used to draw top-left line junctions. Default is junction_char.
- bottom_right_junction_char - single character string used to draw bottom-right line junctions. Default is junction_char
- bottom_left_junction_char - single character string used to draw bottom-left line junctions. Default is junction_char.
我们编写一个设置高级样式的示例:
运行程序,效果图如下:
可以看到,我们设置的几个属性都起作用了。如
x.int_format = '03'
设置整数数据打印方式的字符串, 整数设置宽为3,不够3位左侧补0,可以看到
序号
、
最低气温
、
最高气温
三列中的数字都不够三位,左侧都补了0。
你可以根据自己喜好设置不同的表格样式。
3.16 改变表格颜色
- prettytable可以使用ANSI颜色码来控制表格的输出颜色。
-
使用时,只需要使用
ColorTable
代替PrettyTable
即可,
如:
-
ColorTable
的使用与PrettyTable
相同,只是额外增加了一些参数,你可以设置自定义主题。
如:
这种是使用prettytable自带的
OCEAN
海洋主题。
查看源码知道主题定义如下:
我们可以自定义主题,类似
OCEAN
海洋主题设置不同的颜色值即可。
维基百科上面详细介绍了 ANSI转义序列 https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97
其中有详细的颜色表!
我们在自定义主题设置时,可以随意使用上表中的前景色代码或背景色代码。
我们按官方示例进行尝试一下:
运行后效果图如下:
此时,可以看到,由于添加了表格标题,标题内容有点移位,不在表格正上方。为了测试颜色效果,我们不配置表格标题再测试。
运行程序,效果图如下:
可以看到,设置的前景色和背景色都起作用了!说明我们创建的自定义主题的配置方法是对的!
3.17 复制表格
有时候,你如果只想复制表格中的某些行,可以使用切片的方式获取子表。
在上一节的基础上,我们直接来获取子表信息: