python console下想实现类excel 一样的格式化表格输出 ,可以通过以下三个模块实现:test_table、PrettyTable、texttable,具体可以参看python wiki 页面。最终实现的效果如下图:

prettytable
prettytable

一、test_table模块

test_table模块是perl下的SimpleTable模块的python化,从pipy站点上的下载量上来看下,基本上没有什么人用,所以该模块略过,不讲,有兴趣的可以到官网上下载试用下。

二、texttable模块

texttable模块属于相当轻量级的,核心文件为texttable.py ,这里使用官方的示例引入模块并使用示例如下:

 1table = Texttable()
 2table.set_cols_align(["l", "r", "c"])
 3table.set_cols_valign(["t", "m", "b"])
 4table.add_rows([["Name", "Age", "Nickname"],
 5                ["Mr\nXavier\nHuon", 32, "Xav'"],
 6                ["Mr\nBaptiste\nClement", 1, "Baby"]])
 7print(table.draw() + "\n")
 8table = Texttable()
 9table.set_deco(Texttable.HEADER)
10table.set_cols_dtype(['t',  # text
11                      'f',  # float (decimal)
12                      'e',  # float (exponent)
13                      'i',  # integer
14                      'a']) # automatic
15table.set_cols_align(["l", "r", "r", "r", "l"])
16table.add_rows([["text",    "float", "exp", "int", "auto"],
17                ["abcd",    "67",    654,   89,    128.001],
18                ["efghijk", 67.5434, .654,  89.6,  12800000000000000000000.00023],
19                ["lmn",     5e-78,   5e-78, 89.4,  .000000000000128],
20                ["opqrstu", .023,    5e+78, 92.,   12800000000000000000000]])
21print(table.draw())

模块直接运行结果如下:

 1[root@361way texttable-0.8.3]# python texttable.py
 2+----------+-----+----------+
 3|   Name   | Age | Nickname |
 4+==========+=====+==========+
 5| Mr       |     |          |
 6| Xavier   |  32 |          |
 7| Huon     |     |   Xav'   |
 8+----------+-----+----------+
 9| Mr       |     |          |
10| Baptiste |   1 |          |
11| Clement  |     |   Baby   |
12+----------+-----+----------+
13 text     float       exp      int     auto
14==============================================
15abcd      67.000   6.540e+02    89   128.001
16efghijk   67.543   6.540e-01    90   1.280e+22
17lmn        0.000   5.000e-78    89   0.000
18opqrstu    0.023   5.000e+78    92   1.280e+22

该模块的输出样式是可自定义的,不过该由于相当轻量级,所以其并不支持以列(column)的方式增加,只支持以行(row)的方式增加数据,并将结果格式化对齐输出。

三、prettytable模块

prettytable模块是三个模块中使用下载人员最多的,也是本篇的重点介绍对象,该模块除了适用于本篇提到的ASCII table 之外,在其模块示例中可以看到其还可以用于同sql及html的交互。

1、ascii table

在格式化输出方式,其除了可以设定输出的格式外,同时相较于texttable模块在增加数据库里也相对灵活,即支持行添加数据,又支持列增加数据,同时还支持混合增加(需要注意的是同时存在行和列的情况下,行增加优先级要高于列增加,不然会报错)。

示例如下:

 1# Row by row...
 2row = PrettyTable()
 3row.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
 4row.add_row(["Adelaide",1295, 1158259, 600.5])
 5row.add_row(["Brisbane",5905, 1857594, 1146.4])
 6row.add_row(["Darwin", 112, 120900, 1714.7])
 7row.add_row(["Hobart", 1357, 205556, 619.5])
 8row.add_row(["Sydney", 2058, 4336374, 1214.8])
 9row.add_row(["Melbourne", 1566, 3806092, 646.9])
10row.add_row(["Perth", 5386, 1554769, 869.4])
11# Column by column...
12col = PrettyTable()
13col.add_column("City name",["Adelaide","Brisbane","Darwin","Hobart","Sydney","Melbourne","Perth"])
14col.add_column("Area", [1295, 5905, 112, 1357, 2058, 1566, 5386])
15col.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769])
16col.add_column("Annual Rainfall",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, 869.4])
17# A mix of both!
18mix = PrettyTable()
19mix.field_names = ["City name", "Area"]
20mix.add_row(["Adelaide",1295])
21mix.add_row(["Brisbane",5905])
22mix.add_row(["Darwin", 112])
23mix.add_row(["Hobart", 1357])
24mix.add_row(["Sydney", 2058])
25mix.add_row(["Melbourne", 1566])
26mix.add_row(["Perth", 5386])
27mix.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769])
28mix.add_column("Annual Rainfall",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, 869.4]

示例运行结果,可以查看模块中的test文件,这里给出最上面截图中使用的代码,如下:

 1from prettytable import *
 2value = 33
 3narrow = ["%.2f" % (i*0.01*value) for i in range(99,89,-1)]
 4narrow.insert(0,'-')
 5add = ["%.2f" % (i*0.01*value) for i in range(101,111)]
 6add.insert(0,'+')
 7field = [i for i in range(1,11)]
 8field.insert(0,'+/-')
 9x = PrettyTable()
10x.field_names = field
11x.add_row(narrow)
12x.add_row(add)
13print(x)

示例中title 和 value 行之间有横线格开,不过两行value 之间没有格开,可以通过修改最后一行为如下,即可实现每行都分格开:

1result = x.get_string(hrules=ALL)
2print(result)

2、在html中显示表格

将增加的数据输出为html 表格,在test示例中也为我们展示了testHtmlBreakLine方法、testHtmlOutput方法、testHtmlOutputFormated方法三个示例。这里不再例举,具体可以参看prettytable_test.py 文件。

3、与数据库的交互

这里的数据库的交互,准确的来说并不恰当,叫与数据源的交互应该更贴切一些,通过查看该包的帮助信息和源文件,可以看到提供的有三个方法:

from_csv、from_db_cursor、from_html 分别是从csv 文件、数据库、html 文件中获取表格的方法。具体可以自行尝试使用。