python console实现表格格式化

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

<a href="https://www.361way.com/wp-content/uploads/2015/06/prettytable.png"><img src="https://www.361way.com/wp-content/uploads/2015/06/prettytable.png" alt="prettytable" width="702" height="115" class="alignnone size-full wp-image-4512" /></a>

一、test_table模块

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

二、texttable模块

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

table = Texttable()
table.set_cols_align(["l", "r", "c"])
table.set_cols_valign(["t", "m", "b"])
table.add_rows([["Name", "Age", "Nickname"],
                ["Mr\nXavier\nHuon", 32, "Xav'"],
                ["Mr\nBaptiste\nClement", 1, "Baby"]])
print(table.draw() + "\n")
table = Texttable()
table.set_deco(Texttable.HEADER)
table.set_cols_dtype(['t',  # text
                      'f',  # float (decimal)
                      'e',  # float (exponent)
                      'i',  # integer
                      'a']) # automatic
table.set_cols_align(["l", "r", "r", "r", "l"])
table.add_rows([["text",    "float", "exp", "int", "auto"],
                ["abcd",    "67",    654,   89,    128.001],
                ["efghijk", 67.5434, .654,  89.6,  12800000000000000000000.00023],
                ["lmn",     5e-78,   5e-78, 89.4,  .000000000000128],
                ["opqrstu", .023,    5e+78, 92.,   12800000000000000000000]])
print(table.draw())
<br />

模块直接运行结果如下:

[root@361way texttable-0.8.3]# python texttable.py
+----------+-----+----------+
|   Name   | Age | Nickname |
+==========+=====+==========+
| Mr       |     |          |
| Xavier   |  32 |          |
| Huon     |     |   Xav'   |
+----------+-----+----------+
| Mr       |     |          |
| Baptiste |   1 |          |
| Clement  |     |   Baby   |
+----------+-----+----------+
 text     float       exp      int     auto
==============================================
abcd      67.000   6.540e+02    89   128.001
efghijk   67.543   6.540e-01    90   1.280e+22
lmn        0.000   5.000e-78    89   0.000
opqrstu    0.023   5.000e+78    92   1.280e+22 
<br />

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

三、prettytable模块

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

1、ascii table

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

示例如下:

# Row by row...
row = PrettyTable()
row.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
row.add_row(["Adelaide",1295, 1158259, 600.5])
row.add_row(["Brisbane",5905, 1857594, 1146.4])
row.add_row(["Darwin", 112, 120900, 1714.7])
row.add_row(["Hobart", 1357, 205556, 619.5])
row.add_row(["Sydney", 2058, 4336374, 1214.8])
row.add_row(["Melbourne", 1566, 3806092, 646.9])
row.add_row(["Perth", 5386, 1554769, 869.4])
# Column by column...
col = PrettyTable()
col.add_column("City name",["Adelaide","Brisbane","Darwin","Hobart","Sydney","Melbourne","Perth"])
col.add_column("Area", [1295, 5905, 112, 1357, 2058, 1566, 5386])
col.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769])
col.add_column("Annual Rainfall",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, 869.4])
# A mix of both!
mix = PrettyTable()
mix.field_names = ["City name", "Area"]
mix.add_row(["Adelaide",1295])
mix.add_row(["Brisbane",5905])
mix.add_row(["Darwin", 112])
mix.add_row(["Hobart", 1357])
mix.add_row(["Sydney", 2058])
mix.add_row(["Melbourne", 1566])
mix.add_row(["Perth", 5386])
mix.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092, 1554769])
mix.add_column("Annual Rainfall",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, 869.4]
<br />

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

from prettytable import *
value = 33
narrow = ["%.2f" % (i*0.01*value) for i in range(99,89,-1)]
narrow.insert(0,'-')
add = ["%.2f" % (i*0.01*value) for i in range(101,111)]
add.insert(0,'+')
field = [i for i in range(1,11)]
field.insert(0,'+/-')
x = PrettyTable()
x.field_names = field
x.add_row(narrow)
x.add_row(add)
print(x)
<br />

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

result = x.get_string(hrules=ALL)
print(result)
<br />

2、在html中显示表格

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

3、与数据库的交互

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

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注