在python中将列表转换为HTML表的最简单方法?

pri*_*stc 19 python html-table html-generation

假设我有一个这样的列表:

['one','two','three','four','five','six','seven','eight','nine']
Run Code Online (Sandbox Code Playgroud)

我想尝试将这些数据转换为各种维度的HTML表格:

one     two    three
four    five   six
seven   eight  nine
Run Code Online (Sandbox Code Playgroud)

要么

one    four   seven
two    five   eight
three  six    nine
Run Code Online (Sandbox Code Playgroud)

要么

one    two   three  four
five   six   seven  eight
nine
Run Code Online (Sandbox Code Playgroud)

是否有一个库可以处理这个,而不需要做疯狂的列表拼接或嵌套的循环?我的谷歌搜索显示有一些HTML库,但我没有时间浏览每一个,看看他们是否可以很好地处理表.有没有人不得不这样做?如果是这样你是怎么做到的?

Ale*_*lli 29

我会将你的问题分解为两部分:

  • 给出一个"平面列表",产生一个子列表列表,其中子列表具有给定的长度,整个列表可以走进"行主要"顺序(您的第一个和第三个示例)或"列主要"(您的第二个)例);
  • 给定一个包含字符串项的子列表列表,从中生成一个HTML表.

我认为这两个任务真的非常截然不同,并且没有任何东西可以获得(并且输掉很多),所以如果任何精心设计的图书馆如此蠢蠢欲动,我会感到惊讶.

对于第1点,行主要很容易:

def row_major(alist, sublen):      
  return [alist[i:i+sublen] for i in range(0, len(alist), sublen)]
Run Code Online (Sandbox Code Playgroud)

和列专业并没有那么糟糕:

def col_major(alist, sublen):
  numrows = (len(alist)+sublen-1) // sublen 
  return [alist[i::sublen] for i in range(numrows)]
Run Code Online (Sandbox Code Playgroud)

例如...:

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
Run Code Online (Sandbox Code Playgroud)

产生你想要的三个结果(每行一个列表,不是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>'
Run Code Online (Sandbox Code Playgroud)

如果您想将其作为单个字符串而不是将其打印出来,请将每个字符串更改printyield并使用'\n'.join(html_table(lol)).

现在,您有两个简单,有用,可用且可重用的构建块 - 只要您想要将数据呈现为HTML表格,并且每当列表列表呈现为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))
Run Code Online (Sandbox Code Playgroud)

难道这种积木式方法不比使用大块胶水的胶水编程更好,更舒适,更高效吗? - - )


Mat*_*ela 7

仅供将来参考,我实现了一个名为simpletable的小型Python模块,以提供简单的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")
Run Code Online (Sandbox Code Playgroud)

由于它不需要第三方软件包,您只需从我的存储库中获取代码并在项目中使用它.


Tom*_*asz 6

使用列表

from tabulate import tabulate

table = [['one','two','three'],['four','five','six'],['seven','eight','nine']]

print(tabulate(table, tablefmt='html'))
Run Code Online (Sandbox Code Playgroud)

产生以下输出。

<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>
Run Code Online (Sandbox Code Playgroud)

  • 很好..我添加了 Prettytable 作为另一个选项。 (2认同)

Han*_*ver 5

另一种选择很漂亮:

from prettytable import PrettyTable
pt = PrettyTable()
Run Code Online (Sandbox Code Playgroud)

如果要生成html格式:

print(pt.get_html_string())
Run Code Online (Sandbox Code Playgroud)

如果只生成ascii格式表:

print(pt.get_string())
Run Code Online (Sandbox Code Playgroud)

请参考官方文档:https : //ptable.readthedocs.io/en/latest/tutorial.html了解更多选项,例如启用不同类型的样式。

请享用。