Skip to main content

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

项目描述

漂亮的桌子

爵士乐队 PyPI 版本 支持的 Python 版本 PyPI 下载 GitHub 操作状态 编解码器 代码风格:黑色

安装

通过 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
x = PrettyTable()

你想把一些数据放进去。你有几个选择。

一行一行

您可以一次添加一行数据。为此,您可以先使用属性设置字段名称,然后使用以下 方法field_names一次添加一行:add_row

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])

一次所有行

当你有一个行列表时,你可以一次性添加它们add_rows

x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
x.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 方法,该方法接受两个参数 - 一个字符串,它是您要添加的列对应的字段的名称,以及一个包含列数据的列表或元组:

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])

混搭

如果你真的想要,你甚至可以混合搭配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(x)

0.5 及更早版本中的旧x.printt()方法已被删除。

要传递更改表格外观的选项,请使用get_string()下面记录的方法:

print(x.get_string())

穿线

如果您不想以 ASCII 格式实际打印表格,而只是获取一个包含使用时打印的内容的字符串print(x),则可以使用以下get_string 方法:

mystring = x.get_string()

保证该字符串看起来与通过执行打印的内容完全相同 print(x)。您现在可以使用字符串执行所有通常可以执行的操作,例如将表写入文件或将其插入 GUI。

控制显示哪些数据

如果您愿意,您可以限制输出print(x)x.get_string仅输出您喜欢的字段或行。

这些方法的fields参数采用要打印的字段名称列表:

print(x.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 列表切片 - 打印表的第 2、第 3 和第 4 行,设置start为 1(第一行是第 0 行,所以第二行是第 1 行)并设置end为 4(第 4 行,加 1):

print(x.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",分别用于左对齐、右对齐和居中对齐:

x 对齐 =  "r"
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 |
| Melbourne | 1566 |    3806092 |           646.9 |
|     Perth | 5386 |    1554769 |           869.4 |
|    Sydney | 2058 |    4336374 |          1214.8 |
+-----------+------+------------+-----------------+
一次一列

align您还可以通过将属性视为字典来根据相应的字段名称更改各个列的对齐方式。

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     |
| 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您可以通过提供一个关键字参数来确保您的 ASCII 表是使用按特定字段排序的数据生成的,该sortby参数必须是包含一个字段名称的字符串。

例如,要打印我们之前构建的澳大利亚首府城市数据示例表,以便人口最多的城市排在最后,我们可以这样做:

print(x.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论点。

如果您总是希望您的表格以某种方式排序,您可以像这样长期设置:

x sortby  =  "人口"
print(x)
print(x)
print(x)

此代码打印的所有三个表格都将按人口排序( x.reversesort = True如果您愿意,您也可以这样做)。该行为将持续存在,直到您将其关闭:

x.sortby = None

如果要指定自定义排序功能,可以使用sort_key关键字参数。传递一个函数,该函数接受两个值列表并根据第一个列表应该出现在第二个列表之前还是之后返回负值或正值。如果您的表有 n 列,则每个列表将有 n+1 个元素。每个列表对应于表格的一行。第一个元素将是参数指定的列中相关行中的任何数据sort_by。其余的 n 个元素是表中每个列中的数据,按顺序排列,包括列中数据的重复实例sort_by

改变你的桌子的外观 - 简单的方法

默认情况下,PrettyTable 生成的 ASCII 表与 SQL 数据库 shell 中使用的表相似。但它也可以以各种其他格式打印它们。如果您要使用的格式是通用的,PrettyTable 使您可以使用该 set_style方法轻松完成。如果你想制作一张不常见的桌子,你必须稍微努力一些(见下文)。

设置表格样式

set_style您可以在调用 print或之前使用该方法为您的表格设置样式get_string。以下是如何以与 Microsoft Word 的“转换为表格”功能完美配合的格式打印表格:

from prettytable import MSWORD_FRIENDLY
x.set_style(MSWORD_FRIENDLY)
print(x)

除了MSWORD_FRIENDLY您可以为您的表格使用这些内置样式:

  • DEFAULT- 默认外观,用于撤消您可能所做的任何样式更改
  • PLAIN_COLUMNS- 一种无边框样式,适用于柱状数据的命令行程序
  • MARKDOWN- 遵循 Markdown 语法的样式
  • ORGMODE- 适合Org 模式语法的表格样式
  • SINGLE_BORDERDOUBLE_BORDER- 使用带有方框图字符的连续单/双边框线的样式,以便在终端上进行更精美的显示

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

改变你的桌子的外观 - 艰难的方式

如果您想以不同于上面列出的内置样式之一的样式显示您的表格,则必须进行艰难的设置。

别担心,这真的没有那么难!

样式选项

PrettyTable 有许多样式选项,用于控制表格显示方式的各个方面。您可以自由地将这些选项中的每一个单独设置为您喜欢的任何选项。该set_style方法只是为您自动执行此操作。

选项如下:

  • border- 一个布尔选项(必须是Trueor False)。控制是否在表格内部和周围绘制边框。
  • preserve_internal_border- 一个布尔选项(必须是Trueor False)。控制即使在border=False.
  • header- 一个布尔选项(必须是Trueor False)。控制表格的第一行是否是显示所有字段名称的标题。
  • hrules- 控制行后水平规则的打印。允许值:FRAME, 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:,}"。可调用的类型 ifcallable[[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

您可以通过两种方式将样式选项设置为您自己的设置:

长期设置风格选项

如果您想多次打印不同样式的表格,您可以通过更改适当的属性来长期设置您的选项。如果你不希望你的表格有边框,你可以这样做:

x.border = False
print(x)
print(x)
print(x)

这样打印的 3 个表格都没有边框,即使您在它们之间添加额外的行也是如此。缺乏边界将持续到您这样做:

x.border = True

再次打开它们。这种长期设置正是如何set_style运作的。 set_style只需将一堆属性设置为您的预设值。

请注意,如果您在创建表格时知道需要哪些样式选项,则可以使用构造函数的关键字参数来指定它们。例如,以下两个代码块是等价的:

x = PrettyTable()
x.border = False
x.header = False
x.padding_width = 5

x = PrettyTable(border=False, header=False, padding_width=5)

只需更改一次样式选项

如果您不想像上一节那样通过更改属性来进行长期的样式更改,您可以get_string通过为这些方法提供关键字参数来进行仅持续一次的更改。要打印两个“普通”表格,它们之间有一个无边框表格,您可以这样做:

print(x)
打印( x .get_string ( border = False ) )打印( x )

用颜色改变你的桌子的外观!

PrettyTable 具有使用 ANSI 颜色代码打印表格的功能。这包括通过 Colorama对大多数 Windows 版本的支持。首先,导入ColorTable 类而不是PrettyTable.

-from prettytable import PrettyTable
+from prettytable.colortable import ColorTable

该类ColorTable可以像 一样使用PrettyTable,但它增加了一个额外的属性。您现在可以指定一个自定义主题,该主题将使用颜色格式化您的表格。

 prettytable.colortable 导入 ColorTable  主题

x  = 颜色表主题=主题海洋

print(x)

创建自定义主题

该类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>s。就像 ASCII 形式一样,您实际上可以获得字符串表示形式 - 只需使用get_html_string(). HTML 打印以与 ASCII 打印完全相同的方式支持、、fieldsstart参数endsortbyreversesort

样式化 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 尽力模仿您的表格使用内联 CSS 设置的样式选项。这是通过为方法提供format=True关键字参数来完成的get_html_string。请注意,如果您总是想打印格式化的 HTML,您可以这样做:

x.format = True

并且设置将持续存在,直到您将其关闭。

就像 ASCII 表一样,如果你想改变一个表的样式, get_html_string你可以传递这些方法的关键字参数——就像print and一样get_string

设置 HTML 属性

get_html_string 您可以使用attributes关键字参数为方法提供 HTML 属性名称/值对的字典。这使您可以指定常见的 HTML 属性,例如idclass可用于链接到您的表格或使用 CSS 自定义其外观。例如:

print(x.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>

杂项

复制表格

您可以copy在不带参数的情况下调用 PrettyTable 对象的方法,以返回表的相同独立副本。

如果您想要仅包含行子集的 PrettyTable 对象的副本,则可以使用列表切片表示法:

new_table = old_table[0:5]

贡献

编辑文件后,使用Black linter 自动格式化更改的行。

python -m pip install black
black prettytable*.py