1

我希望在我的 PrettyTable 中添加一个页脚,总计存储在上面的行中的数据。我在脚本中创建了一个计数,但我想将它添加到表中。

我必须创建下表的代码如下(.add_row在循环中):

outTbl = PrettyTable(["Projects", "Number"])
outTbl.add_row([eachProj, count])

...生成一个如下所示的表格:

+--------------------------+-----------+
|        Projects          |   Number  |
+--------------------------+-----------+
|        Project A         |     5     |
|        Project B         |     9     |
|        Project C         |     8     |
|        Project D         |     2     |
+--------------------------+-----------+

...但我正在寻找创建上表的功能,底部有一个摘要页脚:

+--------------------------+-----------+
|        Projects          |   Number  |
+--------------------------+-----------+
|        Project A         |     5     |
|        Project B         |     9     |
|        Project C         |     8     |
|        Project D         |     2     |
+--------------------------+-----------+
|          Total           |     24    |
+--------------------------+-----------+

我已经在线搜索了模块文档:PrettyTable tutorialGoogle prettytable - Tutorial并且看不到对页脚的任何引用,我发现令人惊讶的是,标题是其中之一。这可以在 PrettyTable 中完成,还是有其他任何人都可以推荐的具有此功能的 Python 模块?

4

6 回答 6

3

您可以使用带有小技巧的文本表:

import texttable

table = texttable.Texttable()
table.add_rows([['Projects', 'Number'],
                ['Project A\nProject B\nProject C\nProject D', '5\n9\n8\n2'],
                ['Total', 24]])
print(table.draw())

输出:

+-----------+--------+
| Projects  | Number |
+===========+========+
| Project A | 5      |
| Project B | 9      |
| Project C | 8      |
| Project D | 2      |
+-----------+--------+
| Total     | 24     |
+-----------+--------+
于 2019-05-15T13:32:56.563 回答
2

我知道我迟到了,但我创建了一个函数来自动将“总计”行附加到表中。现在不解决列是否比表格宽。

Python3.6++

功能:

def table_footer(tbl, text, dc):
    res = f"{tbl._vertical_char} {text}{' ' * (tbl._widths[0] - len(text))} {tbl._vertical_char}"

    for idx, item in enumerate(tbl.field_names):
        if idx == 0:
            continue
        if not item in dc.keys():
            res += f"{' ' * (tbl._widths[idx] + 1)} {tbl._vertical_char}"
        else:
            res += f"{' ' * (tbl._widths[idx] - len(str(dc[item])))} {dc[item]} {tbl._vertical_char}"

    res += f"\n{tbl._hrule}"
    return res

用法:

tbl = PrettyTable()
tbl.field_names = ["Symbol", "Product", "Size", "Price", "Subtotal", "Allocation"]
tbl.add_row([......])

print(tbl)
print(table_footer(tbl, "Total", {'Subtotal': 50000, 'Allocation': '29 %'}

+--------+-------------------------------+-------+---------+----------+------------+
| Symbol |            Product            |  Size |  Price  | Subtotal | Allocation |
+--------+-------------------------------+-------+---------+----------+------------+
|    AMD |   Advanced Micro Devices Inc  | 999.9 |  75.99  |  20000.0 |      23.00 |
|   NVDA |          NVIDIA Corp          |  88.8 |  570.63 |  30000.0 |       6.00 |
+--------+-------------------------------+-------+---------+----------+------------+
| Total  |                               |       |         |    50000 |       29 % |
+--------+-------------------------------+-------+---------+----------+------------+
于 2021-05-10T23:12:40.457 回答
2

在漂亮的表格中没有单独的函数来创建页脚。但是,您可以做一些小技巧来创建,以防您特别只使用漂亮的表,如下所示

sum = 0
for row in outTbl:
     sum = sum + int(row.get_string(fields=["Number"]).split('\n')[3].replace('|','').replace(' ',''))
outTbl.add_row(['------------','-----------'])
outTbl.add_row(['Total',sum])
print (outTbl)

输出

或者,如果您正在寻找带有页脚的特定功能,您可以查看 https://stackoverflow.com/a/26937531/3249782 以了解您可以使用的不同方法

于 2019-05-15T16:00:03.270 回答
1

查看漂亮表格的源代码后,您可以看到打印表格后,您可以获得每个列的宽度。使用它你可以自己创建一个页脚,因为漂亮的表格没有给你这个选项。这是我的方法:

from prettytable import PrettyTable

t = PrettyTable(['Project', 'Numbers'])
t.add_row(['Project A', '5'])
t.add_row(['Project B', '9'])
t.add_row(['Project C', '8'])
t.add_row(['Project D', '2'])
print(t)
total = '24'
padding_bw = (3 * (len(t.field_names)-1))
tb_width = sum(t._widths)
print('| ' + 'Total' + (' ' * (tb_width - len('Total' + total)) +
                        ' ' * padding_bw) + total + ' |')
print('+-' + '-' * tb_width + '-' * padding_bw + '-+')

这是输出:

+-----------+---------+
|  Project  | Numbers |
+-----------+---------+
| Project A |    5    |
| Project B |    9    |
| Project C |    8    |
| Project D |    2    |
+-----------+---------+
| Total            24 |
+---------------------+

只需更改代码中的总变量,一切都应该正常工作

于 2020-11-18T19:37:43.473 回答
1

我今天遇到了同样的问题,并使用以下方法将表格的最后 n 行视为由水平线分隔的结果行(如分隔标题的行):

from prettytable import PrettyTable

t = PrettyTable(['Project', 'Numbers'])
t.add_row(['Project A', '5'])
t.add_row(['Project B', '9'])
t.add_row(['Project C', '8'])
t.add_row(['Project D', '2'])

# NOTE: t is the prettytable table object
# Get string to be printed and create list of elements separated by \n
list_of_table_lines = t.get_string().split('\n')

# Use the first line (+---+-- ...) as horizontal rule to insert later
horizontal_line = list_of_table_lines[0]

# Print the table
# Treat the last n lines as "result lines" that are seperated from the
# rest of the table by the horizontal line
result_lines = 1
print("\n".join(list_of_table_lines[:-(result_lines + 1)]))
print(horizontal_line)
print("\n".join(list_of_table_lines[-(result_lines + 1):]))

这导致以下输出:

+-----------+---------+
| 项目 | 数字 |
+------------+---------+
| 项目A | 5 |
| 项目 B | 9 |
| 项目 C | 8 |
+------------+---------+
| 项目 D | 2 |
+------------+---------+
于 2020-12-03T16:26:23.393 回答
0

我偷了@Niels 解决方案并执行此功能以在最后num_footers一行之前使用分隔符进行打印:

def print_with_footer(ptable, num_footers=1):
    """ Print a prettytable with an extra delimiter before the last `num` rows """
    lines = ptable.get_string().split("\n")
    hrule = lines[0]
    lines.insert(-(num_footers + 1), hrule)
    print("\n".join(lines))
于 2021-04-08T08:51:34.663 回答