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

时间:2009-09-25 02:23:42

标签: python html-table html-generation

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

['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

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

7 个答案:

答案 0 :(得分:28)

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

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

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

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

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表格,并且每当列表列表呈现时,将它们分开就会派上用场因为HTML表来自任何其他构建它的方式。将它们组合在一起很容易在应用程序代码中完成,但当然也很容易做一个简单的“粘合例程”,例如,假设基于yield的{​​{1}}版本和单个字符串结果是理想的:

html_table

这种积木方法是不是比用大块胶水胶水编程更好,更舒适,更有效率?? - )

答案 1 :(得分:6)

为了供将来参考,我实现了一个名为 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")

由于它不需要第三方软件包,您只需从my repository获取代码并在项目中使用它。

答案 2 :(得分:3)

使用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>

答案 3 :(得分:2)

周围有几个模板库(Genshi是我喜欢的,但还有很多其他的)。

或者你也可以这样做:

def print_table(data, row_length):
    print '<table>'
    counter = 0
    for element in data:
        if counter % row_length == 0:
            print '<tr>'
        print '<td>%s</td>' % element
        counter += 1
        if counter % row_length == 0:
            print '</tr>'
    if counter % row_length != 0:
        for i in range(0, row_length - counter % row_length):
            print '<td>&nbsp;</td>'
        print '</tr>'
    print '</table>'

答案 4 :(得分:1)

另一种选择是漂亮的:

from prettytable import PrettyTable
pt = PrettyTable()

如果要生成html格式:

print(pt.get_html_string())

如果仅生成ascii格式表:

print(pt.get_string())

请参考官方文档:official docs,以获得更多选择,例如,启用各种样式。

享受。

答案 5 :(得分:0)

对玩具代码来说,操纵模板可能更容易,= p

def get_html_tbl(seq, col_count):
    if len(seq) % col_count:
        seq.extend([''] * (col_count - len(seq) % col_count))
    tbl_template = '<table>%s</table>' % ('<tr>%s</tr>' % ('<td>%s</td>' * col_count) * (len(seq)/col_count))
    return tbl_template % tuple(seq)

答案 6 :(得分:0)

尽管以前已经回答过,但是这是使用 numpy pandas DataFrame 的另一种解决方案。由于当今有很多人对数据科学感兴趣,所以我认为使用熊猫解决这个问题会很有趣:

  

GITHUB解决方案:
  我已经在solution上提供了my GitHub Repository,您也可以在Google合作实验室中运行和浏览(强烈建议这样做)。

我在这里使用的自定义功能generate_html_with_table())在此Jupyter Notebook中可用。

  

解决方案:
  要获得您的解决方案,请运行以下命令:

data = ['one','two','three','four','five','six','seven','eight','nine']
columns = 4                   # Number of Columns
columns_or_rows = columns
column_name_prefix = 'Column' # Prefix for Column headers
span_axis = 1                 # Span along a row (1) or a column (0) first
showOutput = True             # Use False to suppress printing output

# Generate HTML
data_html, data_df = generate_html_with_table(data, columns_or_rows, column_name_prefix, span_axis, showOutput)
  

输出:

HTML Generated: 

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Column_0</th>
      <th>Column_1</th>
      <th>Column_2</th>
      <th>Column_3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>one</td>
      <td>two</td>
      <td>three</td>
      <td>four</td>
    </tr>
    <tr>
      <th>1</th>
      <td>five</td>
      <td>six</td>
      <td>seven</td>
      <td>eight</td>
    </tr>
    <tr>
      <th>2</th>
      <td>nine</td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

code_output_with_spanning_along_a_row