一个简单的 Python 库,用于以视觉上吸引人的 ASCII 表格格式轻松显示表格数据
项目描述
漂亮的桌子
安装
通过 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_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(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_BORDER
和DOUBLE_BORDER
- 使用带有方框图字符的连续单/双边框线的样式,以便在终端上进行更精美的显示
其他样式可能会出现在未来的版本中。
改变你的桌子的外观 - 艰难的方式
如果您想以不同于上面列出的内置样式之一的样式显示您的表格,则必须进行艰难的设置。
别担心,这真的没有那么难!
样式选项
PrettyTable 有许多样式选项,用于控制表格显示方式的各个方面。您可以自由地将这些选项中的每一个单独设置为您喜欢的任何选项。该set_style
方法只是为您自动执行此操作。
选项如下:
border
- 一个布尔选项(必须是True
orFalse
)。控制是否在表格内部和周围绘制边框。preserve_internal_border
- 一个布尔选项(必须是True
orFalse
)。控制即使在border=False
.header
- 一个布尔选项(必须是True
orFalse
)。控制表格的第一行是否是显示所有字段名称的标题。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 打印完全相同的方式支持、、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 尽力模仿您的表格使用内联 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 属性,例如id
和class
可用于链接到您的表格或使用 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