在Python中将列表转换为HTML表格的最简单方法是什么?

37 投票
7 回答
150844 浏览
提问于 2025-04-15 14:35

假设我有这样一个列表:

['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表格。把它们组合在一起在你的应用代码中很简单,当然也可以做一个简单的“粘合程序”,例如,假设使用基于yieldhtml_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))

这种构建块的方法是不是比把所有东西混在一起的方式更好、更愉快,也更高效呢?-)

撰写回答