[Tutor] Is there a way to use "with" across suite boundaries?

Alan Gauld alan.gauld at btinternet.com
Sat May 23 11:27:54 CEST 2015


On 23/05/15 06:56, Jim Mooney Py3.4.3winXP wrote:
> '''I was using with open...:, but I'm printing a header in one function,
> calling a looping
> function to print detail lines, then returning to the calling function to
> print
> the footer. But that didn't work since the with statement only seems to work
> with the lexical suite and the file wasn't open in the detail print
> function.

What does that mean? Did you get an error message? If so what?
Was the file empty? What happened? Be specific.

> a way around this, other than passing the file as I have here?

Passing the file object around is good, its not "a way around".
Its what you should be doing. Passing objects into functions and getting 
a result back is what good programming encourages.
Leaking objects across function boundaries from the outside
(eg with global variables) is bad and should be avoided.


> Since this is a file there are enclosing single quotes not visible:

I don't know what you mean by that.
What is a file? The data below?
Why would that put it in enclosing quotes?

> "ANTIGUA AND BARBUDA",0,0,0,0,0
> "ARGENTINA",37,35,33,36,39
> "BAHAMAS, THE",1,1,1,1,1
> "BAHRAIN",5,6,6,6,6
> "SPANISH INQUISITION, THE, SILLY",10,33,14,2,8
>
> Program follows (py3.4, winxp):'''
>
> htbegin = '''
...
> '''

> htend = '''
...

> '''
>
> def make_lines():
>      co2 = open('co2-sample.csv')
>      ht = open('output.html', 'w')
>      linelist = []
>      print(htbegin, file=ht)

Why not just write to the file directly?

ht.write(htbegin)

>      for line in co2:
>          newlist = line.rsplit(',', 5) # ending is regular so split it out
> first
>          for token in newlist:         # since split char inside quotes for
> nation is problematic

Use the csv file to parse csv files, it is much more reliable and avoids 
all the strange exceptional cases such as embedded commas,
split lines etc.

>              linelist.append(token.strip('"')) # get rid of extra quotes
>              linelist[-1] = linelist[-1].strip()
>          fprint(linelist, ht)
>          linelist = []

I don't think resetting the list adds much value?

>      co2.close()
>      print(htend, file=ht)

ht.write(htend)

>      ht.close()
>
>
> def fprint(linelist, ht):
>      # size formatting irrelevant for HTML
>      formatted_string = "<td
> class=l>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td>".format(*linelist)

your table has no rows, is that deliberate? I'd expect a <tr> at the 
beginning...

>      print(formatted_string, file=ht)

ht.write(formatted_string)

>      print('</tr>', file=ht)

and now you add a </tr> at the end. Why not just put it
inside the string?


-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos




More information about the Tutor mailing list