2017-06-02 137 views
0

试图创建几个包含来自读取csv文件的表格的网页,并试图定义一个函数来创建html网页,而不是多次编写相同的代码。定义一个函数在python中生成html页面

读我的CSV文件:

infile = open("new.csv", "r") 
data = [] 
for line in infile: 
    cols = line.split(",") 
    Oposition = cols[0] 
    Winner = cols[1] 
    Margin = cols[2] 
    Ground = cols[3] 
    Year = cols[4] 
    pair = (Oposition, Winner, Margin, Ground, Year) 
    data.append(pair) 
infile.close() 

到目前为止我的代码是:

page = """<!DOCTYPE html> 
    <html> 
    <head> 
    <title>abc</title> 
    <style> 
h1 { 
    text-align: center; 
} 
body { 
    background-image: url("2014.png"); 
    background-repeat: no-repeat; 
    background-position: right top; 
    background-attachment: fixed; 
} 
</style> 
    </head> 
    <body> 
    <h1>{{heading}}</h1> 
    {{paragraph}} 
    <p><a href = "index.html">Back to main page</a></p> 
    <table border="1"><tr><th>Oposition</th><th>Winner</th><th>Margin</th><th>Ground</th><th>Year</th></tr> 

""" 

out1=page.format(heading = "2012 Stats", paragraph = "<p>aaaaaaa</p>") 
out2 = page.format(heading = "2013 Stats", paragraph = "<p>bbbbb</P>") 
out3 = page.format(heading = "2014 Stats", paragraph = "<p>cccc</P>") 
out4 = page.format(heading = "2015 Stats", paragraph = "<p>ddddCSK</p>") 

def write_html_file(filename, body): 
    out = open(filename, "w") 
    out.write(body) 

write_html_file("2012.html",out1) 
write_html_file("2013.html",out2) 
write_html_file("2014.html",out3) 
write_html_file("2015.html",out4) 

for r in data: 
    if ''.join(r[4].split()) == "2012": 
     Oposition = r[0] 
     Winner = r[1] 
     Margin = r[2] 
     Ground=r[3] 
     Year = r[4] 
     out1.write("<tr> <td>" + Oposition+ '</td><td> '+ Winner+'</td><td> '+Margin+'</td><td> '+Ground+' </td><td>'+ Year+ " </td></tr>") 
    elif ''.join(r[4].split()) == "2013": 
     Oposition = r[0] 
     Winner = r[1] 
     Margin = r[2] 
     Ground=r[3] 
     Year = r[4] 
     out2.write("<tr> <td>" + Oposition+ '</td><td> '+ Winner+'</td><td> '+Margin+'</td><td> '+Ground+' </td><td>'+ Year+ " </td></tr>") 
    elif ''.join(r[4].split()) == "2014": 
     Oposition = r[0] 
     Winner = r[1] 
     Margin = r[2] 
     Ground=r[3] 
     Year = r[4] 
     out3.write("<tr> <td>" + Oposition+ '</td><td> '+ Winner+'</td><td> '+Margin+'</td><td> '+Ground+' </td><td>'+ Year+ " </td></tr>") 
    elif ''.join(r[4].split()) == "2015": 
     Oposition = r[0] 
     Winner = r[1] 
     Margin = r[2] 
     Ground=r[3] 
     Year = r[4] 
     out4.write("<tr> <td>" + Oposition+ '</td><td> '+ Winner+'</td><td> '+Margin+'</td><td> '+Ground+' </td><td>'+ Year+ " </td></tr>") 

def output(a): 
    a.write("</table> </body>\n") 
    a.write("</html>\n") 
    a.close() 

output(out1) 
output(out2) 
output(out3) 
output(out4) 

我尝试按年2012年,2013年,2014年,2015年,使表和HTML页面,使其包含他们每个人。只是不知道。 任何帮助或其他选项?非常感谢 我得到一个错误消息说:

---> 25 page1 = page.format(heading = "2012 Stats", paragraph = "<p>aaaa</p>") 
KeyError: '\n text-align' 
+0

我收到此错误信息:---> 38 OUT1 = page.format(标题=“2012 Stats”,paragraph =“

aaaaa

”)KeyError:'\ n text-align' – Dush

+0

你看过类似'jinja2'的东西,你定义一个HTML模板,将它传递给一个上下文,然后构建为你的文件? –

+0

它看起来像你的out2和out3以大写闭合段落标记结束。 – brt

回答

0

简答

Python的内置string format syntax是单paramthesis包围的变量。这就是为什么'\ n text-align'被视为一个关键,而它的目的是成为一种CSS风格。

解决方案

您可以继续逃避你的CSS代码段,但是我不会推荐它,因为HTML文本将无法读取,而且将难以维持。

因此,请使用模板引擎来提供帮助。有很多模板引擎:Jinja2Mako ..等。由于我比较熟悉的第一个,让我告诉你如何得到第1页工作::

from jinja2 import Environment 

env = Environment() 
page_template = env.from_string(page) 
page1 = page_template(heading="2012 Stats", paragraph="<p>aaaaaaa</p>") 

而且你需要安装的Jinja2 :

$ pip install jinja2 

替代解决方案

你可以用我的图书馆pyexcelpyexcel-text获取为您呈现的html表格。示例代码:

import pyexcel as p 

sheet = p.get_sheet(file_name='new.csv') 
sheet.colnames = ['Oposition', 'Winner', 'Margin', 'Ground', 'Year'] 
sheet.name = "2012 Stats" 
print(sheet.html) 

要运行上面的代码,你需要安装这两个额外的软件包:

$ pip install pyexcel pyexcel-text 
+0

是的,我可以使它使用jinja2。非常感谢 – Dush

相关问题