从Tuple Python生成HTML表

时间:2014-11-09 16:27:10

标签: python python-2.7

我有个人元组列表。我想为每个人生成一个HTML表格。我确定有一种简单的方法可以做到这一点,但我不知道那会是什么。我把一些我认为很接近的代码放在一起,但可能不是一种有效的方法。

期望的输出:

<html>
<table>
<tr><td>Andrew</td><td>10</td><td>20</td></tr>
<tr><td>Andrew</td><td>54</td><td>56</td></tr>
</table>
<table>
<tr><td>Jim</td><td>20</td><td>12</td></tr>
<tr><td>Jim</td><td>23</td><td>15</td></tr>
</table>
<table>
<tr><td>Sarah</td><td>30</td><td>43</td></tr>
</table>

我的代码:

mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
mytuple = sorted(mytuple)
FULL_HTML = ""

for row in mytuple:
     individual_count =  mytuple.count(row[0])
     print individual_count

     for row1 in xrange(row, row + individual_count):
        HTML_BODY "<tr><td>" + row1[0] + "</td><td>" + row1[1] + "</td><td>" + row1[2] + "</td><td></tr>\n"

     FULL_HTML = "<table>\n" _ FULL_HTML + HTML_BODY +"\n</table>\n"

FULL_HTML = "<html>\n" + FULL_HTML + "\n</html>"

print FULL_HTML

5 个答案:

答案 0 :(得分:2)

您无法使用list.count()方法计算名称字符串;你必须循环遍历所有元组并手动计数。无论如何,这两种方法都没有效率。

虽然您可以简单地跟踪上次输出的名称,并在每次遇到名称时添加</table><table>行,但更好的选择是使用itertools.groupby() function让Python为你分组名称:

from itertools import groupby
from operator import itemgetter

mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
mytuple = sorted(mytuple)
FULL_HTML = []

for name, rows in groupby(mytuple, itemgetter(0)):
     table = []
     for name, value1, value2 in rows:
        table.append(
            "<tr><td>{}</td><td>{}</td><td>{}</td><td></tr>".format(
                name, value1, value2))

     table = "<table>\n{}\n</table>".format('\n'.join(table))
     FULL_HTML.append(table)

FULL_HTML = "<html>\n{}\n</html>".format('\n'.join(FULL_HTML))

print FULL_HTML

operator.itemgetter() object选出要分组的每个元组的第一个元素。

演示:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
>>> mytuple = sorted(mytuple)
>>> FULL_HTML = []
>>> for name, rows in groupby(mytuple, itemgetter(0)):
...      table = []
...      for name, value1, value2 in rows:
...         table.append(
...             "<tr><td>{}</td><td>{}</td><td>{}</td><td></tr>".format(
...                 name, value1, value2))
...      table = "<table>\n{}\n</table>".format('\n'.join(table))
...      FULL_HTML.append(table)
... 
>>> FULL_HTML = "<html>\n{}\n</html>".format('\n'.join(FULL_HTML))
>>> print FULL_HTML
<html>
<table>
<tr><td>Andrew</td><td>10</td><td>20</td><td></tr>
<tr><td>Andrew</td><td>54</td><td>56</td><td></tr>
</table>
<table>
<tr><td>Jim</td><td>20</td><td>12</td><td></tr>
<tr><td>Jim</td><td>23</td><td>15</td><td></tr>
</table>
<table>
<tr><td>Sarah</td><td>30</td><td>43</td><td></tr>
</table>
</html>

答案 1 :(得分:0)

考虑使用像Mako(http://www.makotemplates.org/)这样的模板引擎。这很容易,从长远来看会节省很多时间。

答案 2 :(得分:0)

或者,跟进Max Noel关于使用mako template engine的建议。

使用以下内容创建index.html文件:

<html>
% for _, rows in data:
    <table>
        % for row in rows:
            <tr>
                % for value in row:
                    <td>${value}</td>
                % endfor
            </tr>
        % endfor
    </table>
% endfor
</html>

然后,在你的python代码中,sortgroup mytuple由第一个元素传递给模板:

from itertools import groupby
from operator import itemgetter

from mako.template import Template


mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
t = Template(filename='index.html')
print t.render(data=groupby(sorted(mytuple), itemgetter(0)))

打印:

<html>
    <table>
            <tr>
                    <td>Andrew</td>
                    <td>10</td>
                    <td>20</td>
            </tr>
            <tr>
                    <td>Andrew</td>
                    <td>54</td>
                    <td>56</td>
            </tr>
    </table>
    <table>
            <tr>
                    <td>Jim</td>
                    <td>20</td>
                    <td>12</td>
            </tr>
            <tr>
                    <td>Jim</td>
                    <td>23</td>
                    <td>15</td>
            </tr>
    </table>
    <table>
            <tr>
                    <td>Sarah</td>
                    <td>30</td>
                    <td>43</td>
            </tr>
    </table>
</html>

答案 3 :(得分:0)

以下是很简单的:

&#13;
&#13;
import pandas as pd

df = pd.DataFrame(list(mytuple),columns['name1','name2','name3'])          #name1,name2,name3 are coloumn headings
html = df.to_html("index.html") 
# Create index.html to write html on it
	f = open("index.html","r+")
	data = f.read()
&#13;
&#13;
&#13;

答案 4 :(得分:0)

@ravi 答案的固定和工作版本,因为由于编辑队列已满,我无法编辑:

import pandas as pd
df = pd.DataFrame(data=list_of_tuples, columns=['name1','name2','name3'])         
html_string = df.to_html() 
相关问题