在Python中将列表转换为HTML表格的最简单方法是什么?
假设我有这样一个列表:
['one','two','three','four','five','six','seven','eight','nine']
我想试着把这些数据变成不同尺寸的HTML表格:
one two three
four five six
seven eight nine
或者
one four seven
two five eight
three six nine
或者
one two three four
five six seven eight
nine
有没有什么库可以帮我做到这一点,而不需要去做复杂的列表切割或者嵌套的循环?我在谷歌上搜索了一下,发现有一些HTML库,但我没有时间去逐个查看它们是否能很好地处理表格。有没有人做过这个?如果有,你是怎么做到的?
7 个回答
11
为了将来参考,我做了一个小的Python模块,叫做simpletable,它可以很方便地生成HTML表格。这个模块也解决了这个问题。
使用起来非常简单,如下所示:
import simpletable
test_data = [str(x) for x in range(20)]
formatted_data = simpletable.fit_data_to_columns(test_data, 5)
table = simpletable.SimpleTable(formatted_data)
html_page = simpletable.HTMLPage(table)
html_page.save("test_page.html")
因为它不需要其他的第三方包,你可以直接从我的仓库获取代码,然后在你的项目中使用。
53
使用 tabulate 这个库。
from tabulate import tabulate
table = [['one','two','three'],['four','five','six'],['seven','eight','nine']]
print(tabulate(table, tablefmt='html'))
这样就会产生以下的输出结果。
<table>
<tbody>
<tr><td>one </td><td>two </td><td>three</td></tr>
<tr><td>four </td><td>five </td><td>six </td></tr>
<tr><td>seven</td><td>eight</td><td>nine </td></tr>
</tbody>
</table>
42
我会把你的问题分成两个部分:
- 首先,给定一个“平面列表”,生成一个子列表的列表,这些子列表有固定的长度,并且整体列表可以按照“行优先”(你的第一个和第三个例子)或“列优先”(你的第二个例子)的方式排列;
- 其次,给定一个包含字符串项的子列表,生成一个HTML表格。
我觉得这两个任务其实是很不同的,把它们混在一起没有好处(反而可能会带来麻烦),所以我会很惊讶如果有哪个设计良好的库会这样做。
关于第一点,行优先的处理很简单:
def row_major(alist, sublen):
return [alist[i:i+sublen] for i in range(0, len(alist), sublen)]
而列优先的处理也不是特别难:
def col_major(alist, sublen):
numrows = (len(alist)+sublen-1) // sublen
return [alist[i::sublen] for i in range(numrows)]
比如说...:
L = ['one','two','three','four','five','six','seven','eight','nine']
for r in row_major(L, 3): print r
print
for r in col_major(L, 3): print r
for r in row_major(L, 4): print r
这样可以得到你想要的三个结果(每行一个列表,目前还不是HTML格式;-)。
问题的第二部分是:从一个字符串的列表生成一个HTML表格:
def html_table(lol):
print '<table>'
for sublist in lol:
print ' <tr><td>'
print ' </td><td>'.join(sublist)
print ' </td></tr>'
print '</table>'
如果你想把它作为一个单一的字符串而不是直接打印出来,可以把每个print
改成yield
,然后使用'\n'.join(html_table(lol))
。
现在你有了两个简单、实用、可用且可重用的构建块——把它们分开会在你想以其他形式展示数据时派上用场,也适用于任何其他方式生成的列表来展示为HTML表格。把它们组合在一起在你的应用代码中很简单,当然也可以做一个简单的“粘合程序”,例如,假设使用基于yield
的html_table
版本,并且希望得到一个单一的字符串结果:
def list_to_html_table(alist, sublength, column_major=False):
if column_major:
lol = col_major(alist, sublength)
else:
lol = row_major(alist, sublength)
return ''.join(html_table(lol))
这种构建块的方法是不是比把所有东西混在一起的方式更好、更愉快,也更高效呢?-)