在找 python 如何输出 markdown 表格的时候发现一个小工具 tabulate,感觉功能还不错。

用法是这样的,比如我们有一个 pandas 的 dataframe

import pandas as pd
from tabulate import tabulate
carsales = pd.DataFrame([[970, 1010, 1015, 1008],
                         [975, 1020, 1002, 1035],
                         [975, 985, 995, 999]],
                        index=['Toyota', 'VW', 'GM'], columns=[2013, 2014, 2015, 2016])

那么可以这样在命令行打印表格

print(tabulate(carsales, headers="keys"))

输出如下:

          2013    2014    2015    2016
------  ------  ------  ------  ------
Toyota     970    1010    1015    1008
VW         975    1020    1002    1035
GM         975     985     995     999

如果希望加边框线,可以这样:

print(tabulate(carsales, tablefmt="grid", headers="keys"))
+--------+--------+--------+--------+--------+
|        |   2013 |   2014 |   2015 |   2016 |
+========+========+========+========+========+
| Toyota |    970 |   1010 |   1015 |   1008 |
+--------+--------+--------+--------+--------+
| VW     |    975 |   1020 |   1002 |   1035 |
+--------+--------+--------+--------+--------+
| GM     |    975 |    985 |    995 |    999 |
+--------+--------+--------+--------+--------+

如果希望输出 markdown 支持的样式,就把 tablefmt 参数改为 pipe:

print(tabulate(carsales, tablefmt="pipe", headers="keys"))
|        |   2013 |   2014 |   2015 |   2016 |
|:-------|-------:|-------:|-------:|-------:|
| Toyota |    970 |   1010 |   1015 |   1008 |
| VW     |    975 |   1020 |   1002 |   1035 |
| GM     |    975 |    985 |    995 |    999 |

tablefmt 参数还有很多种支持,像 ‘plain’, ‘simple’, ‘grid’, ‘fancy_grid’, ‘latex’, ‘pipe’, ‘orgtbl’, ‘rst’, ‘mediawiki’ 之类的可以尽情尝试一下。

当然,如果不用 pandas,直接传入一个二维数组也是可以的:

print(tabulate([[1, 2.34], [-56, "8.999"], ["2", "10001"]]))
---  ---------
  1      2.34
-56      8.999
  2  10001
---  ---------