跳转到主要内容

一个简单的Python库,可轻松以视觉上吸引人的ASCII表格格式显示表格数据

项目描述

PrettyTable

Jazzband PyPI version Supported Python versions PyPI downloads GitHub Actions status codecov Code style: Black

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_rowadd_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_BORDERDOUBLE_BORDER - 使用连续的单/双边框线条和框绘制字符进行终端更华丽显示的样式

其他样式可能会在未来版本中出现。

改变表格外观 - 困难的方法

如果您想以除上述内置样式之外的方式显示表格,您将不得不通过困难的方法来设置。

别担心,这其实并不难!

样式选项

PrettyTable 有许多样式选项,用于控制表格的显示方式。您可以自由地将这些选项分别设置为您的偏好。set_style 方法会自动为您完成这项操作。

选项包括

选项 详细信息
border 布尔选项(必须是 TrueFalse)。控制是否在表格内部和周围绘制边框。
preserve_internal_border 布尔选项(必须是 TrueFalse)。控制即使在 border=False 时,表格内部是否仍然绘制边框。
header 布尔选项(必须是 TrueFalse)。控制表格的第一行是否为标题,显示所有字段的名称。
hrules 控制行后打印水平规则。允许的值:FRAMEHEADERALLNONE
HEADERALLNONE 这些是定义在 prettytable 模块内部的变量,请确保导入它们或使用 prettytable.FRAME 等。
vrules 控制列之间打印垂直规则。允许的值:FRAMEALLNONE
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_charhorizontal_charjunction_char 用于创建表格轮廓的字符
vertical_colorhorizontal_colorjunction_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 打印完全相同的 fieldsstartendsortbyreversesort 参数。

样式化 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的表格样式,可以传递这些方法的键值参数 - 就像printget_string一样。

设置HTML属性

您可以通过attributes键值参数向get_html_string方法提供一个HTML属性名/值对的字典。这使得您可以指定常见的HTML属性,如idclass,这些属性可用于链接到您的表格或使用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_headerescape_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

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

prettytable-3.11.0.tar.gz (57.5 kB 查看散列)

上传时间

构建分布

prettytable-3.11.0-py3-none-any.whl (28.7 kB 查看散列)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面