tabulate

书中自有黄金屋,书中自有颜如玉。

—— 北宋·赵恒·《励学篇》

用过 MySQL 的童鞋一定对那个非常好看的字符表格印象深刻吧!

Python 中,使用 tabulate 库,可轻松实现一模一样的字符表格。

快速上手

废话不多说,先来看看效果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
    >>> from tabulate import tabulate

    >>> table_header = ['Name', 'Chinese', 'Math', 'English']
    >>> table_data = [
    ...     ('Tom', '90', '80', '85'),
    ...     ('Jim', '70', '90', '80'),
    ...     ('Lucy', '90', '70', '90'),
    ... ]

    >>> print(tabulate(table_data, headers=table_header, tablefmt='grid'))
    +--------+-----------+--------+-----------+
    | Name   |   Chinese |   Math |   English |
    +========+===========+========+===========+
    | Tom    |        90 |     80 |        85 |
    +--------+-----------+--------+-----------+
    | Jim    |        70 |     90 |        80 |
    +--------+-----------+--------+-----------+
    | Lucy   |        90 |     70 |        90 |
    +--------+-----------+--------+-----------+

上述代码,先从 tabulate 库导入同名工具函数; 接着,定义一个用于演示的数据表格,包括表头和表数据; 最后,用 tabulate 函数格式化表格,传参包括表数据,表头以及表格样式。

看到没有,引入 tabulate 函数后,只需要一行代码即可完成表格输出!

回过头来看看如何安装 tabulate 。你可能已经猜到了:

1
    $ pip install tabulate

是的,就是这么简单!

中文对齐

默认没有考虑中文字符宽度,因此无法对齐:

1
2
3
4
5

    +---------+--------+---------+--------+
    | 工具      | 持仓     | 总成本     | 平均成本   |
    +---------+--------+---------+--------+

解决这个问题只需安装 wcwidth 包:

1
    $ pip install wcwidth

并在代码中导入:

1
    import wcwidth

表格样式

tabulate 提供多种表格输出风格,列举如下:

plain

1
2
3
4
5
    >>> print(tabulate(table_data, headers=table_header, tablefmt='plain'))
    Name      Chinese    Math    English
    Tom            90      80         85
    Jim            70      90         80
    Lucy           90      70         90

simple

1
2
3
4
5
6
    >>> print(tabulate(table_data, headers=table_header, tablefmt='simple'))
    Name      Chinese    Math    English
    ------  ---------  ------  ---------
    Tom            90      80         85
    Jim            70      90         80
    Lucy           90      70         90

grid

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    >>> print(tabulate(table_data, headers=table_header, tablefmt='grid'))
    +--------+-----------+--------+-----------+
    | Name   |   Chinese |   Math |   English |
    +========+===========+========+===========+
    | Tom    |        90 |     80 |        85 |
    +--------+-----------+--------+-----------+
    | Jim    |        70 |     90 |        80 |
    +--------+-----------+--------+-----------+
    | Lucy   |        90 |     70 |        90 |
    +--------+-----------+--------+-----------+

fancy_grid

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    >>> print(tabulate(table_data, headers=table_header, tablefmt='fancy_grid'))
    ╒════════╤═══════════╤════════╤═══════════╕
    │ NameChineseMathEnglish │
    ╞════════╪═══════════╪════════╪═══════════╡
    │ Tom908085 │
    ├────────┼───────────┼────────┼───────────┤
    │ Jim709080 │
    ├────────┼───────────┼────────┼───────────┤
    │ Lucy907090 │
    ╘════════╧═══════════╧════════╧═══════════╛

pipe

1
2
3
4
5
6
    >>> print(tabulate(table_data, headers=table_header, tablefmt='pipe'))
    | Name   |   Chinese |   Math |   English |
    |:-------|----------:|-------:|----------:|
    | Tom    |        90 |     80 |        85 |
    | Jim    |        70 |     90 |        80 |
    | Lucy   |        90 |     70 |        90 |

orgtlb

1
2
3
4
5
6
    >>> print(tabulate(table_data, headers=table_header, tablefmt='orgtbl'))
    | Name   |   Chinese |   Math |   English |
    |--------+-----------+--------+-----------|
    | Tom    |        90 |     80 |        85 |
    | Jim    |        70 |     90 |        80 |
    | Lucy   |        90 |     70 |        90 |

jira

1
2
3
4
5
    >>> print(tabulate(table_data, headers=table_header, tablefmt='jira'))
    || Name   ||   Chinese ||   Math ||   English ||
    | Tom    |        90 |     80 |        85 |
    | Jim    |        70 |     90 |        80 |
    | Lucy   |        90 |     70 |        90 |

presto

1
2
3
4
5
6
    >>> print(tabulate(table_data, headers=table_header, tablefmt='presto'))
     Name   |   Chinese |   Math |   English
    --------+-----------+--------+-----------
     Tom    |        90 |     80 |        85
     Jim    |        70 |     90 |        80
     Lucy   |        90 |     70 |        90

psql

1
2
3
4
5
6
7
8
    >>> print(tabulate(table_data, headers=table_header, tablefmt='psql'))
    +--------+-----------+--------+-----------+
    | Name   |   Chinese |   Math |   English |
    |--------+-----------+--------+-----------|
    | Tom    |        90 |     80 |        85 |
    | Jim    |        70 |     90 |        80 |
    | Lucy   |        90 |     70 |        90 |
    +--------+-----------+--------+-----------+

rst

1
2
3
4
5
6
7
8
    >>> print(tabulate(table_data, headers=table_header, tablefmt='rst'))
    ======  =========  ======  =========
    Name      Chinese    Math    English
    ======  =========  ======  =========
    Tom            90      80         85
    Jim            70      90         80
    Lucy           90      70         90
    ======  =========  ======  =========

html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    >>> print(tabulate(table_data, headers=table_header, tablefmt='html'))
    <table>
    <thead>
    <tr><th>Name  </th><th style="text-align: right;">  Chinese</th><th style="text-align: right;">  Math</th><th style="text-align: right;">  English</th></tr>
    </thead>
    <tbody>
    <tr><td>Tom   </td><td style="text-align: right;">       90</td><td style="text-align: right;">    80</td><td style="text-align: right;">       85</td></tr>
    <tr><td>Jim   </td><td style="text-align: right;">       70</td><td style="text-align: right;">    90</td><td style="text-align: right;">       80</td></tr>
    <tr><td>Lucy  </td><td style="text-align: right;">       90</td><td style="text-align: right;">    70</td><td style="text-align: right;">       90</td></tr>
    </tbody>
    </table>

注意到, tabulate 函数也可以用来生成 html 表格定义代码。 此外,还支持 mediawikimoinmoinyoutracklatexlatex_rawlatex__booktabstextile 表格生成。

订阅更新,获取更多学习资料,请关注我们的公众号:

【随笔】系列文章首发于公众号【小菜学编程】,敬请关注: