如何创建Python PrettyTable的页脚

xtupzzrd  于 12个月前  发布在  Python
关注(0)|答案(7)|浏览(88)

我希望添加一个页脚到我的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模块可以推荐吗?

93ze6v8z

93ze6v8z1#

您可以使用texttable与周围的小黑客:

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     |
+-----------+--------+
w80xi6nr

w80xi6nr2#

漂亮的表中没有单独的创建页脚的函数。不过你可以做一些小技巧来创建,如果你是特别使用只漂亮的表如下

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,了解可以使用的不同方法

xdyibdwo

xdyibdwo3#

我今天遇到了同样的问题,并使用了以下方法将表的最后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):]))

这将产生以下输出:

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

vsmadaxz4#

我知道我迟到了,但是我创建了一个函数来自动向表中添加一个“总计”行。现在还不能解决列是否比表宽的问题。
Python 3.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 % |
+--------+-------------------------------+-------+---------+----------+------------+
zf9nrax1

zf9nrax15#

在检查了pretty table的源代码后,你可以看到,在打印表格后,你可以得到每个列的宽度。使用这个你可以自己创建一个页脚,因为漂亮的表不给予你这个选项。以下是我的方法:

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 |
+---------------------+

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

ukqbszuj

ukqbszuj6#

我偷了@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))
qltillow

qltillow7#

prettytable通过将divider=True传递给add_row()来支持页脚。
下面是一个来自https://pypi.org/project/prettytable/的示例
验证码:

x = PrettyTable()
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], divider=True)
x.add_row(["Melbourne", 1566, 3806092, 646.9])
x.add_row(["Perth", 5386, 1554769, 869.4])
x.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     |
+-----------+------+------------+-----------------+

相关问题