添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
慷慨大方的镜子  ·  雄商高铁·  8 月前    · 
失望的苹果  ·  WinPcap: Exported ...·  11 月前    · 
Skip to content

表格美化输出模块prettytable

本文约32000字。简单使用的话,仅阅读到3.3节 添加字段名和数据 即可。

1. 概述

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 复制表格

有时候,你如果只想复制表格中的某些行,可以使用切片的方式获取子表。

在上一节的基础上,我们直接来获取子表信息: