<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">import numpy as N
import Image,ImageFont,ImageDraw,ImageOps

pfad="./"#"/storage/sdcard0/prediction/"

jj=N.genfromtxt(pfad+"tmean.txt" ,usecols=(0),skip_header=0,dtype="I")
mm=N.genfromtxt(pfad+"tmean.txt",usecols=(1),skip_header=0,dtype="I")
tt=N.genfromtxt(pfad+"tmean.txt",usecols=(3),skip_header=0,dtype="f")	
jx=N.genfromtxt(pfad+"tmax.txt",usecols=(0),skip_header=0,dtype="f")
tx=N.genfromtxt(pfad+"tmax.txt",usecols=(3),skip_header=0,dtype="f")

ja=1993
je=2017

jo=N.arange(ja,je+1,1)
mo=N.arange(1,13,1)
nj=len(jo)
nm=len(mo)

mx=N.zeros((nj,nm),float)
sx=N.zeros((nj,nm),float)
hx=N.zeros((nj),float)

for j in range(nj):
    for m in range(nm):
  
        w=N.ma.masked_where(jj!=jo[j],tt)
        w=N.ma.masked_where(mm!=mo[m],w)
        w=N.ma.masked_where(tt&lt;-100.,w)
        w=w.compressed()
    
        mx[j,m]=N.mean(w)
        sx[j,m]=N.std(w)
   
    w=N.ma.masked_where(jj!=jo[j],tx)
    w=N.ma.masked_where(tx&lt;30.,w)
    w=w.compressed()
    
    hx[j]=len(w)
    
print jo
    
my=N.diff(mx,axis=0)
sy=N.diff(sx,axis=0)
hy=N.diff(hx)

print '%5s'%('Year')

for j in range(nj-1):

   print '%5i'%(jo[j+1])

print nj,hy.shape,N.shape(hy[:nj-2])

#########

per=['JUN-AUG MEAN TEMPERATURE:','JUL-AUG MEAN TEMPERATURE:','HOT DAYS:']
fac=[-25.,-25.,-5.]

z=-1

for opt in ['jja','ja','heta']:

   z=z+1

   x=N.ones((nj-1,6),float)

   x[:,1]=sy[:,0]
   x[:,2]=sy[:,1]
   x[:,3]=sy[:,2]
   x[:,4]=sy[:,3]
   x[:,5]=my[:,3]

   if(opt=="jja"):y=N.mean(my[:,5:8],1)
   if(opt=="ja"):y=N.mean(my[:,6:8],1)
   if(opt=="heta"):y=hy

   a=N.linalg.lstsq(x[:nj-2,:],y[:nj-2])[0]

   #print a

   fit=N.dot(x[:nj-2,:],a)

   b=N.cumsum(a[1:]*x[:nj-2,1:],1)
   #print b.shape

   c=N.corrcoef(y[:nj-2],fit)
   co=c[0,1]**2

   xy=[]
   xz=[]

   for j in range(nj-1):
    
      if(j&lt;nj-2):
         
         xy.append((40+j*20,140+fac[z]*y[j]))
         xz.append((40+j*20,140+fac[z]*fit[j]))

      else:
    
         fit=N.dot(x[nj-2,:],a)
         if(z==0): az = a      
         print "%4i: obs: %3.1f mod: %3.1f r2: %3.2f"%(jo[j+1],y[j],fit,co)
         con=N.cumsum(a[1:]*x[nj-2,1:])
   
         if(opt=='jja'): jja = 240.-((fit+N.mean(mx[nj-2,5:8]))-16.)*40.; jja0 = 240.-(N.mean(mx[nj-2,5:8])-16.)*40.; jja1 = 240.-(N.mean(mx[nj-1,5:8])-16.)*40.;print fit+N.mean(mx[nj-2,5:8])
         if(opt=='ja'): ja = 240.-((fit+N.mean(mx[nj-2,6:8]))-16.)*40.; ja0 = 240.-(N.mean(mx[nj-2,6:8])-16.)*40.; ja1 = 240.-(N.mean(mx[nj-1,6:8])-16.)*40.
         if(opt=='heta'): heta = 240.-((fit+hx[nj-2])-2.)*10.; heta0 = 240.-(hx[nj-2]-2.)*10.; heta1 = 240.-(hx[nj-1]-1.9)*10.
   
   fits = []
   
   for j in range(nj-3):
         
      xdum = x[:nj-2,:]
      ydum = y[:nj-2]      
            
      xdum = N.delete(xdum,j,0)
      ydum = N.delete(ydum,j)   
            
      aa=N.linalg.lstsq(xdum,ydum)[0]

      ff=N.dot(x[nj-2,:],aa)      
      
      fits.append(ff)   

   som = y

   ############

   im = Image.new('RGB',(500,280),(255,255,255))
   dr = ImageDraw.Draw(im)
   font=ImageFont.truetype(pfad+"arial.ttf",16)
   fonk=ImageFont.truetype(pfad+"arial.ttf",12)

   dr.rectangle((40,60,480,220),fill=(240,240,240,50))
   dr.rectangle((40,80,480,200),fill=(220,220,220,50))
   dr.rectangle((40,100,480,180),fill=(200,200,200,50))
   dr.rectangle((40,120,480,160),fill=(180,180,180,50))

   dr.rectangle((20,60,40,80),fill=(240,0,0,50))
   dr.rectangle((20,80,40,100),fill=(200,0,0,50))
   dr.rectangle((20,100,40,120),fill=(160,0,0,50))
   dr.rectangle((20,120,40,140),fill=(120,0,0,50))

   dr.rectangle((20,140,40,160),fill=(0,0,120,50))
   dr.rectangle((20,160,40,180),fill=(0,0,160,50))
   dr.rectangle((20,180,40,200),fill=(0,0,200,50))
   dr.rectangle((20,200,40,220),fill=(0,0,240,50))

   for x in range(20,500,20):
      gl=[]
      for y in range(40,260,20):
         gl.append((x,y))
      dr.line(gl,"rgb(150,150,150)")   
    
   for y in range(40,260,20):
      gl=[]
      for x in range(20,500,20):
         gl.append((x,y))
      dr.line(gl,"rgb(220,220,220)")  
     
   gl=[]
   for x in range(20,500,20):
      gl.append((x,140))
   dr.line(gl,"rgb(0,0,0)")  
         
   gl=[]
   for y in range(40,260,20):
      gl.append((40,y))
   dr.line(gl,"rgb(0,0,0)")   

   dr.line(xy,"rgb(255,0,0)")
   dr.line(xz,"rgb(0,0,255)")   
   
   for ik in fits:
   
       dr.ellipse((39+(nj-2)*20,139+fac[z]*ik,41+(nj-2)*20,141+fac[z]*ik),fill='grey')
   
   dr.ellipse((39+(nj-2)*20,139+fac[z]*fit,41+(nj-2)*20,141+fac[z]*fit),fill='black')
   dr.text((40+(nj-2)*20,125+fac[z]*fit),str(N.round(fit,1)),fill=(0,0,0),font=fonk)

   dr.text((360,40),"OBS",fill=(255,0,0),font=font) 
   dr.text((400,40),"SIM",fill=(0,0,255),font=font)
   dr.text((440,40),"EST",fill=(0,0,0),font=font)         
   
   dr.text((40,20),per[z]+" POTSDAM (r2="+str(N.round(co,2))+")",fill=(0,0,0,100),font=font)
   dr.text((40,250),"(c) peterh@pik-potsdam.de",fill=(200,200,200,50),font=font)

   for j in xrange(0,nj,5):

      dr.text((22+20*j,220),str(jo[j+1]),fill=(0,0,0),font=font)

   txt=Image.new('L',(280,280)) 
   d = ImageDraw.Draw(txt) 
   d.text((80,0),"DIFFERENTIALS",font=font,fill=200) 
   w=txt.rotate(90,expand=1)

   im.paste(ImageOps.colorize(w,(0,0,0),(0,0,0)),(0,0),w)

   im.save(pfad+"pred_"+opt+".png")

   ##########

   im = Image.new('RGB',(280,280),(255,255,255))
   dr = ImageDraw.Draw(im)
   font=ImageFont.truetype(pfad+"arial.ttf",14)

   dr.rectangle((40,40,240,240),fill=(240,240,240,50))
   dr.rectangle((90,40,240,240),fill=(220,220,220,50))
   dr.rectangle((140,40,240,240),fill=(200,200,200,50))
   dr.rectangle((190,40,240,240),fill=(180,180,180,50))

   for y in range(40,260,20):
      gl=[]
      for x in range(40,290,50):
         gl.append((x,y))
      dr.line(gl,"rgb(150,150,150)")   
  
   for x in range(40,290,50):
      gl=[]
      for y in range(40,260,20):
         gl.append((x,y))
      dr.line(gl,"rgb(220,220,220)")  
       
   gl=[]
   for x in range(40,290,50):
      gl.append((x,140))
   dr.line(gl,"rgb(0,0,0)")   

   for j in range(nj-2):
      xy=[]
      for k in range(4):
         xy.append((40+50*k,140+fac[z]*b[j,k]))
      xy.append((40+50*4,140+fac[z]*som[j]))
  
      if(som[j]&lt;-0.5):
    
         dr.line(xy,"rgb(0,0,255)")
         dr.text((245,140+fac[z]*som[j]),str(jo[j+1]),fill="rgb(0,0,255)",font=font)

      if(som[j]&gt;0.5):
   
         dr.line(xy,"rgb(255,0,0)")
         dr.text((245,140+fac[z]*som[j]),str(jo[j+1]),fill="rgb(255,0,0)",font=font)

   for k in range(4):

      dr.ellipse((39+50*k,139.+fac[z]*con[k],41+50*k,141.+fac[z]*con[k]),fill='black')

   dr.text((50,52),"+0.5K",fill=(255,0,0,100),font=font) 
   dr.text((50,72),"-0.5K",fill=(0,0,255,100),font=font)
   dr.text((40,20),"CONTRIBUTIONS: POTSDAM",fill=(0,0,0),font=font)
   dr.text((40,250),"(c) peterh@pik-potsdam.de",fill=(200,200,200),font=font)

   dr.text((30,220),"Jan",fill=(0,0,0),font=font)
   dr.text((80,220),"Feb",fill=(0,0,0),font=font)
   dr.text((130,220),"Mar",fill=(0,0,0),font=font)
   dr.text((180,220),"Apr",fill=(0,0,0),font=font)
   dr.text((230,220),"JJA",fill=(0,0,0),font=font)

   txt=Image.new('L',(280,280)) 
   d = ImageDraw.Draw(txt) 
   d.text((80,10),"DIFFERENTIALS",font=font,fill=200) 
   w=txt.rotate(90,expand=1)

   im.paste(ImageOps.colorize(w,(0,0,0),(0,0,0)),(0,0),w)
   im.save(pfad+"cont_"+opt+".png")

###############

im = Image.new('RGB',(280,280),(255,255,255))
dr = ImageDraw.Draw(im)
font=ImageFont.truetype(pfad+"arial.ttf",12)

dr.rectangle((50,jja,80,240),fill=(251,192,45))
dr.rectangle((120,ja,150,240),fill=(230,74,25))
dr.rectangle((190,heta,220,240),fill=(223,31,162))

dr.line(((50,jja0),(80,jja0)),"rgb(251,192,45)")
dr.line(((120,ja0),(150,ja0)),"rgb(230,74,25)")
dr.line(((190,heta0),(220,heta0)),"rgb(223,31,162)")

dr.line(((50,jja1),(80,jja1)),"rgb(0,0,0)")
dr.line(((120,ja1),(150,ja1)),"rgb(0,0,0)")
dr.line(((190,heta1),(220,heta1)),"rgb(0,0,0)")

tem = ['16.0','16.5','17.0','17.5','18.0','18.5','19.0','19.5','20.0','20.5','21.0']
tem = tem[::-1]

day = ['2','4','6','8','10','12','14','16','18','20','22']
day = day[::-1]

i = -1

for y in range(40,260,20):
   
   i = i+1
   
   gl=[]
   for x in range(40,290,50):
      gl.append((x,y))
   dr.line(gl,"rgb(150,150,150)")

   if(y&gt;40):

      dr.text((85,y-15),tem[i],fill=(0,0,0),font=font)
      dr.text((155,y-15),tem[i],fill=(0,0,0),font=font)
      dr.text((225,y-15),day[i],fill=(0,0,0),font=font)

dr.text((45,20),"Jun-Aug",fill=(0,0,0),font=font)
dr.text((115,20),"Jul-Aug",fill=(0,0,0),font=font)
dr.text((185,20),"Hot-Days",fill=(0,0,0),font=font)

dr.text((40,250),"(c) peterh@pik-potsdam.de",fill=(200,200,200),font=font)

font=ImageFont.truetype(pfad+"arial.ttf",20)

txt=Image.new('L',(280,280)) 
d = ImageDraw.Draw(txt) 
d.text((80,10),"2015 vs. 2016",font=font,fill=200) 
w=txt.rotate(90,expand=1)

im.paste(ImageOps.colorize(w,(0,0,0),(0,0,0)),(0,0),w)

im.save(pfad+"pred_all.png")

###############

f=open(pfad+'app.html','w')
f.write('&lt;html&gt;\n')
f.write('&lt;body bgcolor="Khaki"&gt;\n')
#f.write('&lt;h1&gt;&lt;a name="L0"&gt;Seasonal Prediction&lt;/a&gt;&lt;/h1&gt;\n')

f.write('&lt;/table&gt;\n')
f.write('&lt;h1&gt;Seasonal Prediction: Summary&lt;/a&gt;&lt;/h1&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;td&gt;&lt;img src="%s" height=345&gt;&lt;/td&gt;\n'%(pfad+'pred_all.png'))
f.write('&lt;td&gt;&lt;img src="%s" height=345&gt;&lt;/td&gt;\n'%(pfad+'1985-2014.png'))
f.write('&lt;/table&gt;\n')

f.write('&lt;h1&gt;&lt;a name="L0"&gt;Background&lt;/a&gt;&lt;/h1&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;colgroup&gt;&lt;col width="200"&gt;&lt;col width="495"&gt;&lt;/colgroup&gt;')
f.write('&lt;tr align="left"&gt;&lt;th&gt;Method:&lt;/th&gt;&lt;td&gt;Univariate Linear Regression&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;Station:&lt;/th&gt;&lt;td&gt;Potsdam (Germany)&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;Parameter:&lt;/th&gt;&lt;td&gt;Daily Mean Temperatur (Tmit)&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;a href="#L1"&gt;Aggregation:&lt;/a&gt;&lt;/th&gt;&lt;td&gt;Monthly Means (m)&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;Monthly Standard Deviations (&amp;sigma;)&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;a href="#L2"&gt;Detrending:&lt;/a&gt;&lt;/th&gt;&lt;td&gt;Differentials&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;Target Values:&lt;/th&gt;&lt;td&gt;&lt;a href="#L3"&gt;Summer Mean Temperature (Jun-Aug)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;&lt;a href="#L4"&gt;Mean Temperature (Jul-Aug)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;&lt;a href="#L5"&gt;Number of Hot Days (hoda)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;Formula:&lt;/th&gt;&lt;td&gt;T&lt;sub&gt;JJA&lt;/sub&gt;=a&amp;bull;&amp;sigma;{T&lt;sub&gt;Jan&lt;/sub&gt;}+b&amp;bull;&amp;sigma;{T&lt;sub&gt;Feb&lt;/sub&gt;}+c&amp;bull;&amp;sigma;{T&lt;sub&gt;Mar&lt;/sub&gt;}+d&amp;bull;&amp;sigma;{T&lt;sub&gt;Apr&lt;/sub&gt;}+e&amp;bull;m{T&lt;sub&gt;Apr&lt;/sub&gt;}&lt;/td&gt;&lt;/tr&gt;\n')
f.write('&lt;tr align="left"&gt;&lt;th&gt;Coefficients:&lt;/th&gt;&lt;td&gt;a = %3.1f&lt;/td&gt;&lt;/tr&gt;\n'%(az[1]))
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;b = %3.1f&lt;/td&gt;&lt;/tr&gt;\n'%(az[2]))
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;c = %3.1f&lt;/td&gt;&lt;/tr&gt;\n'%(az[3]))
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;d = %3.1f&lt;/td&gt;&lt;/tr&gt;\n'%(az[4]))
f.write('&lt;tr align="left"&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;e = %3.1f&lt;/td&gt;&lt;/tr&gt;\n'%(az[5]))
f.write('&lt;/table&gt;\n')

f.write('&lt;h1&gt;&lt;a name="L1"&gt;Absolute Values (OBS)&lt;/a&gt;&lt;/h1&gt;&lt;a href="#L0"&gt;TOP&lt;/a&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;colgroup&gt;&lt;col width="60"&gt;&lt;col width="120"&gt;&lt;col width="120"&gt;&lt;col width="120"&gt;&lt;col width="60"&gt;&lt;col width="60"&gt;&lt;col width="60"&gt;&lt;col width="60"&gt;&lt;/colgroup&gt;')
f.write('&lt;tr&gt;&lt;th&gt;Potsdam&lt;/th&gt;&lt;th colspan="3"&gt;Targets&lt;/th&gt;&lt;th colspan="4"&gt;Predictors&lt;/th&gt;&lt;/tr&gt;\n') 
f.write('&lt;tr&gt;&lt;th&gt;Year&lt;/th&gt;&lt;th&gt;Jun-Aug (&amp;deg;C)&lt;/th&gt;&lt;th&gt;Jul-Aug (&amp;deg;C)&lt;/th&gt;&lt;th&gt;Hot-Days (d)&lt;/th&gt;&lt;th&gt;sFeb&lt;/th&gt;&lt;th&gt;sMar&lt;/th&gt;&lt;th&gt;sApr&lt;/th&gt;&lt;th&gt;mApr&lt;/th&gt;&lt;/tr&gt;\n')

for j in range(nj):

   f.write('&lt;tr align=right&gt;\n')
   f.write('&lt;td&gt;%5i&lt;/td&gt;&lt;td&gt;%5.1f&lt;/td&gt;&lt;td&gt;%5.1f&lt;/td&gt;&lt;td&gt;%3i&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;\n'%(jo[j],N.mean(mx[j,5:8]),N.mean(mx[j,6:8]),hx[j],sx[j,1],sx[j,2],sx[j,3],mx[j,3]))
   f.write('&lt;/tr&gt;\n')

f.write('&lt;/table&gt;\n')

f.write('&lt;h1&gt;&lt;a name="L2"&gt;Differentials (OBS)&lt;/a&gt;&lt;/h1&gt;&lt;a href="#L0"&gt;TOP&lt;/a&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;colgroup&gt;&lt;col width="60"&gt;&lt;col width="120"&gt;&lt;col width="120"&gt;&lt;col width="120"&gt;&lt;col width="60"&gt;&lt;col width="60"&gt;&lt;col width="60"&gt;&lt;col width="60"&gt;&lt;/colgroup&gt;')
f.write('&lt;tr&gt;&lt;th&gt;Potsdam&lt;/th&gt;&lt;th colspan="3"&gt;Targets&lt;/th&gt;&lt;th colspan="4"&gt;Predictors&lt;/th&gt;&lt;/tr&gt;\n')  
f.write('&lt;tr&gt;&lt;th&gt;Year&lt;/th&gt;&lt;th&gt;Jun-Aug (K)&lt;/th&gt;&lt;th&gt;Jul-Aug (K)&lt;/th&gt;&lt;th&gt;Hot-Days (d)&lt;/th&gt;&lt;th&gt;sFeb&lt;/th&gt;&lt;th&gt;sMar&lt;/th&gt;&lt;th&gt;sApr&lt;/th&gt;&lt;th&gt;mApr&lt;/th&gt;&lt;/tr&gt;\n')

for j in range(nj-1):

   f.write('&lt;tr align=right&gt;\n')
   f.write('&lt;td&gt;%5i&lt;/td&gt;&lt;td&gt;%5.1f&lt;/td&gt;&lt;td&gt;%5.1f&lt;/td&gt;&lt;td&gt;%3i&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;&lt;td&gt;%3.1f&lt;/td&gt;\n'%(jo[j+1],N.mean(my[j,5:8]),N.mean(my[j,6:8]),hy[j],sy[j,1],sy[j,2],sy[j,3],my[j,3]))
   f.write('&lt;/tr&gt;\n')

f.write('&lt;/table&gt;\n')

f.write('&lt;h1&gt;&lt;a name="L3"&gt;Estimate: Jun-Aug&lt;/a&gt;&lt;/h1&gt;&lt;a href="#L0"&gt;TOP&lt;/a&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;td&gt;&lt;img src="%s"&gt;&lt;/td&gt;\n'%(pfad+'pred_jja.png'))
f.write('&lt;td&gt;&lt;img src="%s"&gt;&lt;/td&gt;\n'%(pfad+'cont_jja.png'))
f.write('&lt;/table&gt;\n')

f.write('&lt;h1&gt;&lt;a name="L4"&gt;Estimate: Jul-Aug&lt;/a&gt;&lt;/h1&gt;&lt;a href="#L0"&gt;TOP&lt;/a&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;td&gt;&lt;img src="%s"&gt;&lt;/td&gt;\n'%(pfad+'pred_ja.png'))
f.write('&lt;td&gt;&lt;img src="%s"&gt;&lt;/td&gt;\n'%(pfad+'cont_ja.png'))
f.write('&lt;/table&gt;\n')

f.write('&lt;h1&gt;&lt;a name="L5"&gt;Estimate: Hot-Days&lt;/a&gt;&lt;/h1&gt;&lt;a href="#L0"&gt;TOP&lt;/a&gt;\n')
f.write('&lt;table border=1 bgcolor="#82b1ff"&gt;\n')
f.write('&lt;td&gt;&lt;img src="%s"&gt;&lt;/td&gt;\n'%(pfad+'pred_heta.png'))
f.write('&lt;td&gt;&lt;img src="%s"&gt;&lt;/td&gt;\n'%(pfad+'cont_heta.png'))
f.write('&lt;/table&gt;\n')

f.write('&lt;/body&gt;\n')
f.write('&lt;/html&gt;\n')


f.close() </pre></body></html>