一个简单的Python库,可轻松以视觉上吸引人的ASCII表格格式显示表格数据
项目描述
PrettyTable
PrettyTable允许您以吸引人的ASCII形式打印表格
+-----------+------+------------+-----------------+
| 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 |
| Melbourne | 1566 | 3806092 | 646.9 |
| Perth | 5386 | 1554769 | 869.4 |
| Sydney | 2058 | 4336374 | 1214.8 |
+-----------+------+------------+-----------------+
安装
通过pip安装
python -m pip install -U prettytable
安装最新开发版本
python -m pip install -U git+https://github.com/jazzband/prettytable
或从requirements.txt
安装
-e git://github.com/jazzband/prettytable.git#egg=prettytable
PrettyTable API使用教程
如何将数据放入(和从中取出)表格
假设您有一个新的PrettyTable
from prettytable import PrettyTable
table = PrettyTable()
并想要向其中添加一些数据。您有几个选项。
逐行
您可以逐行添加数据。为此,您首先可以使用 field_names
属性设置字段名称,然后逐行使用 add_row
方法添加
table.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
table.add_row(["Adelaide", 1295, 1158259, 600.5])
table.add_row(["Brisbane", 5905, 1857594, 1146.4])
table.add_row(["Darwin", 112, 120900, 1714.7])
table.add_row(["Hobart", 1357, 205556, 619.5])
table.add_row(["Sydney", 2058, 4336374, 1214.8])
table.add_row(["Melbourne", 1566, 3806092, 646.9])
table.add_row(["Perth", 5386, 1554769, 869.4])
一次性添加所有行
当您有一系列行时,可以使用 add_rows
一次性添加它们
table.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
table.add_rows(
[
["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
方法,该方法需要两个参数 - 一个字符串,它是您要添加的列对应的字段名称,以及一个包含列数据的列表或元组
table.add_column("City name",
["Adelaide","Brisbane","Darwin","Hobart","Sydney","Melbourne","Perth"])
table.add_column("Area", [1295, 5905, 112, 1357, 2058, 1566, 5386])
table.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092,
1554769])
table.add_column("Annual Rainfall",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9,
869.4])
混合搭配
如果您真的想,您甚至可以将 add_row
和 add_column
混合使用,以某种方式构建部分表格,以另一种方式构建另一部分。但是,以这种方式构建的表格对其他人来说可能有些混乱,因此除非您有充分的理由,否则请不要这样做。
从CSV文件导入数据
如果您的表格数据存储在逗号分隔的值文件(.csv)中,您可以像这样将此数据读入PrettyTable
from prettytable import from_csv
with open("myfile.csv") as fp:
mytable = from_csv(fp)
从数据库游标导入数据
如果您有一个可以通过符合Python DB-API(例如使用 sqlite
模块访问的SQLite数据库)访问的数据库,并且您可以将表格数据存储在数据库中,那么您可以使用游标对象构建一个PrettyTable,如下所示
import sqlite3
from prettytable import from_db_cursor
connection = sqlite3.connect("mydb.db")
cursor = connection.cursor()
cursor.execute("SELECT field1, field2, field3 FROM my_table")
mytable = from_db_cursor(cursor)
获取数据
从PrettyTable获取数据有三种方式,按完整性顺序排列
del_row
方法需要一个整数索引以删除单个行。del_column
方法需要一个字段名称以删除单个列。clear_rows
方法不接收任何参数,删除表格中的所有行 - 但保留字段名称,以便您可以使用相同类型的数据重新填充。clear
方法不接收任何参数,删除所有行和所有字段名称。虽然它并不完全等同于创建一个新的表格实例 - 样式相关的设置(稍后讨论)将保持不变。
以ASCII形式显示您的表格
PrettyTable的主要目标是让您以吸引人的ASCII形式打印表格,如下所示
+-----------+------+------------+-----------------+
| 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 |
| Melbourne | 1566 | 3806092 | 646.9 |
| Perth | 5386 | 1554769 | 869.4 |
| Sydney | 2058 | 4336374 | 1214.8 |
+-----------+------+------------+-----------------+
您可以将表格以这种方式打印到 stdout
或获取它们的字符串表示。
打印
要打印ASCII格式的表格,只需这样做
print(table)
旧版本的 table.printt()
方法已在版本0.5及以下版本中删除。
要传递更改表格外观的选项,请使用下面文档化的 get_string()
方法
print(table.get_string())
字符串化
如果您不想实际以ASCII形式打印表格,而是只获取一个包含 将要打印的内容 的字符串,您可以使用 get_string
方法
mystring = table.get_string()
这个字符串保证看起来与使用 print(table)
打印的内容完全相同。您现在可以像处理字符串一样处理它,例如将表格写入文件或将它插入到GUI中。
您可以使用 get_formatted_string
通过更改 out_format=<text|html|json|csv|latex>
来以多种不同的格式显示表格。此函数将传递参数到渲染表格的函数,因此可以提供额外的参数。这提供了一种让用户选择输出格式的方法。
def my_cli_function(table_format: str = 'text'):
...
print(table.get_formatted_string(table_format))
控制哪些数据被显示
如果您喜欢,您可以限制 print(table)
或 table.get_string
的输出,只显示您喜欢的字段或行。
这些方法的 fields
参数需要打印的字段名称列表
print(table.get_string(fields=["City name", "Population"]))
给出
+-----------+------------+
| City name | Population |
+-----------+------------+
| Adelaide | 1158259 |
| Brisbane | 1857594 |
| Darwin | 120900 |
| Hobart | 205556 |
| Melbourne | 3806092 |
| Perth | 1554769 |
| Sydney | 4336374 |
+-----------+------------+
《start》和《end》参数分别表示要打印的第一行和最后一行的索引。请注意,索引方式与Python列表切片类似——要打印表的第二、第三和第四行,将《start》设置为1(第一行是第0行,因此第二行是第1行),将《end》设置为4(第四行的索引加1)。
print(table.get_string(start=1, end=4))
打印
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Brisbane | 5905 | 1857594 | 1146.4 |
| Darwin | 112 | 120900 | 1714.7 |
| Hobart | 1357 | 205556 | 619.5 |
+-----------+------+------------+-----------------+
更改列的对齐方式
默认情况下,表中的所有列都是居中对齐的。
一次调整所有列
您可以通过将一个单字符字符串分配给《align》属性,一次性更改表中所有列的对齐方式。允许的字符串为《"l"》、《"r"`和《"c"`,分别表示左对齐、右对齐和居中对齐。
table.align = "r"
print(table)
给出
+-----------+------+------------+-----------------+
| 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 |
| Melbourne | 1566 | 3806092 | 646.9 |
| Perth | 5386 | 1554769 | 869.4 |
| Sydney | 2058 | 4336374 | 1214.8 |
+-----------+------+------------+-----------------+
一次调整一列
您还可以将《align》属性作为字典处理,根据相应的字段名更改单个列的对齐方式。
table.align["City name"] = "l"
table.align["Area"] = "c"
table.align["Population"] = "r"
table.align["Annual Rainfall"] = "c"
print(table)
给出
+-----------+------+------------+-----------------+
| 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 |
| Melbourne | 1566 | 3806092 | 646.9 |
| Perth | 5386 | 1554769 | 869.4 |
| Sydney | 2058 | 4336374 | 1214.8 |
+-----------+------+------------+-----------------+
按字段排序表
您可以通过给《get_string`传递一个《sortby》关键字参数(必须是一个包含一个字段名称的字符串),确保ASCII表按特定字段排序。
例如,要打印我们之前建立的澳大利亚首都数据示例表,使人口最多的城市排在最后,我们可以这样做
print(table.get_string(sortby="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 |
+-----------+------+------------+-----------------+
如果我们要使人口最多的城市排在《第一`,我们也可以提供一个《reversesort=True`参数。
如果您《总是`希望您的表按特定方式排序,您可以像这样长期设置此设置
table.sortby = "Population"
print(table)
print(table)
print(table)
此代码打印的所有三个表都将按人口排序(如果您想的话,也可以将《table.reversesort = True`)的行为将持续到您关闭它。
table.sortby = None
如果您想指定一个自定义排序函数,可以使用《sort_key`关键字参数。传递一个接受两个值列表并返回一个负值或正值(取决于第一个列表是否应在第二个列表之前或之后显示)的函数。如果您的表有n列,则每个列表将有n+1个元素。每个列表对应于表的一行。第一个元素是《sort_by`参数指定的列中的相关行中的数据。其余n个元素是表中每个列的数据,按顺序排列,包括《sort_by`列中的数据重复一次。
向表中添加部分
您可以使用《divider`参数将表划分为不同的部分。这将在设置此字段的行下方添加一个分隔线。因此,我们可以设置一个像这样的表
table = PrettyTable()
table.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
table.add_row(["Adelaide", 1295, 1158259, 600.5])
table.add_row(["Brisbane", 5905, 1857594, 1146.4])
table.add_row(["Darwin", 112, 120900, 1714.7])
table.add_row(["Hobart", 1357, 205556, 619.5], divider=True)
table.add_row(["Melbourne", 1566, 3806092, 646.9])
table.add_row(["Perth", 5386, 1554769, 869.4])
table.add_row(["Sydney", 2058, 4336374, 1214.8])
以获得一个像这样的表
+-----------+------+------------+-----------------+
| 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 |
+-----------+------+------------+-----------------+
| Melbourne | 1566 | 3806092 | 646.9 |
| Perth | 5386 | 1554769 | 869.4 |
| Sydney | 2058 | 4336374 | 1214.8 |
+-----------+------+------------+-----------------+
如果对表进行排序,则将删除添加的所有分隔线。
更改表外观的简单方法
默认情况下,PrettyTable生成的ASCII表看起来像SQL数据库shell中使用的表。但它也可以以多种其他格式打印。如果您想使用的格式很常见,PrettyTable使用《set_style`方法使您能够轻松地这样做。如果您想生成不常见的表,您可能需要做些更困难的事情(参见下文)。
设置表样式
您可以在调用《print`或《get_string`之前使用《set_style`方法设置表样式。以下是如何打印Markdown格式的表
from prettytable import MARKDOWN
table.set_style(MARKDOWN)
print(table)
除了《MARKDOWN`之外,您还可以使用以下内置样式
DEFAULT
- 默认外观,用于撤销您可能做出的任何样式更改PLAIN_COLUMNS
- 无边框样式,适用于命令行程序中的列数据MSWORD_FRIENDLY
- 与Microsoft Word的“转换为表格”功能配合得很好的格式ORGMODE
- 适合Org模式语法的表样式SINGLE_BORDER
和DOUBLE_BORDER
- 使用连续的单/双边框线条和框绘制字符进行终端更华丽显示的样式
其他样式可能会在未来版本中出现。
改变表格外观 - 困难的方法
如果您想以除上述内置样式之外的方式显示表格,您将不得不通过困难的方法来设置。
别担心,这其实并不难!
样式选项
PrettyTable 有许多样式选项,用于控制表格的显示方式。您可以自由地将这些选项分别设置为您的偏好。set_style
方法会自动为您完成这项操作。
选项包括
选项 | 详细信息 |
---|---|
border |
布尔选项(必须是 True 或 False )。控制是否在表格内部和周围绘制边框。 |
preserve_internal_border |
布尔选项(必须是 True 或 False )。控制即使在 border=False 时,表格内部是否仍然绘制边框。 |
header |
布尔选项(必须是 True 或 False )。控制表格的第一行是否为标题,显示所有字段的名称。 |
hrules |
控制行后打印水平规则。允许的值:FRAME 、HEADER 、ALL 、NONE 。 |
HEADER 、ALL 、NONE |
这些是定义在 prettytable 模块内部的变量,请确保导入它们或使用 prettytable.FRAME 等。 |
vrules |
控制列之间打印垂直规则。允许的值:FRAME 、ALL 、NONE 。 |
int_format |
一个字符串,控制整数数据的打印方式。它的工作方式类似于:print("%<int_format>d" % data) 。 |
float_format |
一个字符串,控制浮点数据的打印方式。它的工作方式类似于:print("%<float_format>f" % data) 。 |
custom_format |
字段和可调用的字典。这允许您设置任何想要的格式 pf.custom_format["my_col_int"] = lambda f, v: f"{v:,}" 。可调用的类型是 Callable[[str, Any], str] |
padding_width |
列数据两侧的空间数量(仅当左和右填充为 None 时使用)。 |
left_padding_width |
列数据左侧的空间数量。 |
right_padding_width |
列数据右侧的空间数量。 |
vertical_char |
用于绘制垂直线的单字符字符串。默认:| 。 |
horizontal_char |
用于绘制水平线的单字符字符串。默认:- 。 |
_horizontal_align_char |
用于在水平线上指示列对齐的单字符字符串。默认:Markdown 中的 : ,否则 None 。 |
junction_char |
用于绘制线接点的单字符字符串。默认:+ 。 |
top_junction_char |
用于绘制顶行接点的单字符字符串。默认:junction_char 。 |
bottom_junction_char |
用于绘制底行接点的单字符字符串。默认:junction_char 。 |
right_junction_char |
用于绘制右行接点的单字符字符串。默认:junction_char 。 |
left_junction_char |
用于绘制左行接点的单字符字符串。默认:junction_char 。 |
top_right_junction_char |
用于绘制顶右行接点的单字符字符串。默认:junction_char 。 |
top_left_junction_char |
用于绘制顶左行接点的单字符字符串。默认:junction_char 。 |
bottom_right_junction_char |
用于绘制底右行接点的单字符字符串。默认:junction_char 。 |
bottom_left_junction_char |
用于绘制底左行接点的单字符字符串。默认:junction_char 。 |
您可以通过两种方式设置样式选项
长期设置样式选项
如果您想多次以不同风格打印表格,只需更改适当的属性即可设置长期选项。如果您不想表格有边框,可以这样做
table.border = False
print(table)
print(table)
print(table)
由该工具打印的3个表格都不会有边框,即使您在它们之间添加额外的行也是如此。没有边框的状态将持续到您再次打开它们
table.border = True
为止。这种长期设置方式正是 set_style
的工作方式。 set_style
只是将一些属性设置为预设值。
注意,如果您在创建表格时就知道您想要的样式选项,您可以使用构造函数的关键字参数来指定它们。例如,以下两个代码块是等价的
table = PrettyTable()
table.border = False
table.header = False
table.padding_width = 5
table = PrettyTable(border=False, header=False, padding_width=5)
仅更改一次样式选项
如果您不想通过更改属性(如上一节中所示)进行长期样式更改,您可以通过提供关键字参数给这些方法来做出持续仅一次 get_string
的更改。要打印两个“普通”表格,它们之间有一个无边框的表格,您可以这样做
print(table)
print(table.get_string(border=False))
print(table)
通过 颜色 改变表格的外观!
PrettyTable 具有使用 ANSI 颜色代码打印表格的功能。这包括通过 Colorama 支持大多数 Windows 版本。要开始,导入 ColorTable
类而不是 PrettyTable
。
-from prettytable import PrettyTable
+from prettytable.colortable import ColorTable
ColorTable
类可以像 PrettyTable
一样使用,但它增加了一个额外的属性。现在您可以指定一个自定义的 主题,该主题将使用颜色格式化表格。
from prettytable.colortable import ColorTable, Themes
table = ColorTable(theme=Themes.OCEAN)
print(table)
创建自定义主题
Theme
类允许您自定义表格中使用的字符和颜色。
参数 | 描述 |
---|---|
default_color |
作为默认值使用的颜色 |
vertical_char ,horizontal_char 和 junction_char |
用于创建表格轮廓的字符 |
vertical_color ,horizontal_color 和 junction_color |
用于样式化每个字符的颜色。 |
注意: 颜色使用
Theme.format_code(s: str)
函数进行格式化。它接受一个字符串。如果字符串以转义代码(如\x1b
)开头,则返回给定的字符串。如果字符串只是空白,则返回""
。如果字符串是数字(如"34"
),则自动将其格式化为转义代码。我建议您查看源代码以获取更多信息。
以 JSON 格式显示您的表格
PrettyTable 还将以 JSON 格式打印表格,作为字段列表和行数组的组合。就像在 ASCII 格式中一样,您实际上可以得到一个字符串表示形式——只需使用 get_json_string()
。
以 HTML 格式显示您的表格
PrettyTable 还将以 HTML 格式打印表格,作为 <table>
。就像在 ASCII 格式中一样,您实际上可以得到一个字符串表示形式——只需使用 get_html_string()
。HTML 打印支持与 ASCII 打印完全相同的 fields
,start
,end
,sortby
和 reversesort
参数。
样式化 HTML 表格
默认情况下,PrettyTable 输出“vanilla”表格的 HTML。HTML 代码相当简单。它看起来像这样
<table>
<thead>
<tr>
<th>City name</th>
<th>Area</th>
<th>Population</th>
<th>Annual Rainfall</th>
</tr>
</thead>
<tbody>
<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>
</tbody>
</table>
如果您愿意,可以要求 PrettyTable 尽其所能模拟表格已设置的样式选项,这可以通过向 get_html_string
方法提供 format=True
关键字参数来实现。请注意,如果您 始终 想要打印格式化的 HTML,您可以这样做
table.format = True
,并且设置将一直持续到您将其关闭。
与ASCII表格类似,如果您只想更改单个get_html_string
的表格样式,可以传递这些方法的键值参数 - 就像print
和get_string
一样。
设置HTML属性
您可以通过attributes
键值参数向get_html_string
方法提供一个HTML属性名/值对的字典。这使得您可以指定常见的HTML属性,如id
和class
,这些属性可用于链接到您的表格或使用CSS自定义其外观。例如
print(table.get_html_string(attributes={"id":"my_table", "class":"red_table"}))
将打印
<table id="my_table" class="red_table">
<thead>
<tr>
<th>City name</th>
<th>Area</th>
<th>Population</th>
<th>Annual Rainfall</th>
</tr>
</thead>
<tbody>
<tr>
... ... ...
</tr>
</tbody>
</table>
设置HTML转义
默认情况下,PrettyTable会在将输出发送到HTML时转义标题和数据字段中的数据。可以通过将escape_header
和escape_data
设置为false来禁用此功能。例如
print(table.get_html_string(escape_header=False, escape_data=False))
杂项事项
复制表格
您可以在PrettyTable对象上调用不带参数的copy
方法,以返回一个相同的独立表格副本。
如果您只想复制PrettyTable对象的行子集,可以使用列表切片表示法
new_table = old_table[0:5]
贡献
编辑文件后,使用Black代码检查器来自动格式化更改的行。
python -m pip install black
black prettytable*.py
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。