假设我有一个这样的列表:
['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库,但我没有时间浏览每一个,看看他们是否可以很好地处理表。有没有人不得不这样做?如果是这样你是怎么做到的?
答案 0 :(得分:28)
我会将您的问题分解为两部分:
我认为这两项任务非常截然不同,并且没有什么可以获得(并且输掉很多),所以如果任何精心设计的图书馆如此蠢蠢欲动,我会感到很惊讶。
对于第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> </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>