【问题标题】:How to Create Footer for Python PrettyTable如何为 Python PrettyTable 创建页脚
【发布时间】:2019-10-02 15:43:09
【问题描述】:

我希望在我的 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 模块?

【问题讨论】:

    标签: python prettytable


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          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,一切都会正常工作

          【讨论】:

            【解决方案5】:

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

            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 对于您可以使用的不同方法

            【讨论】:

              【解决方案6】:

              您可以使用 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     |
              +-----------+--------+
              

              【讨论】:

                猜你喜欢
                • 2011-08-25
                • 1970-01-01
                • 2013-09-07
                • 1970-01-01
                • 2020-05-06
                • 2021-10-22
                • 2013-01-02
                • 1970-01-01
                • 2019-11-08
                相关资源
                最近更新 更多