[Tutor] Alternative File I/O for Tuples (fwd)

Don Parris webdev at matheteuo.org
Tue Jun 28 18:26:38 CEST 2005


On Tue, 28 Jun 2005 05:50:54 -0400
Kent Johnson <kent37 at tds.net> wrote:

> Don Parris wrote:
> > Just getting back to this - Mondays are always hectic.  This recipe is
> > the one I saw and like.  It looks cool!  In my brief efforts tinkering
> > with it, I am not really getting very far.  I saved the recipe, and
> > import it into the file containing all my database functions.  In one of
> > the functions, I have the following:
> > 
> > I used the "from tbl_Tabs import *" approach to import the recipe.  If I
> > should be doing this differently, just say so.
> > 
> >     for record in Results:
> >         print '%-15s\t%-15s\t%-15s' % record    
> > # I still want to print to screen, then...
> > 
> >         mbrPhone = open('mbrPhone.txt', 'w')
> >         mbrPhone.write(indent(record, hasHeader=False,
> >         separateRows=True)) mbrPhone.close()
> 
> The problem is you are just passing one record to indent(). It processes
> the whole table at once so you have to pass the list of records, i.e.
>         mbrPhone.write(indent(Results, hasHeader=False,
>         separateRows=True))
> 
> and do this outside the loop or you will write the file once for every
> record. So your code should look like this:
> 
>     for record in Results:
>         print '%-15s\t%-15s\t%-15s' % record    
> # I still want to print to screen, then...
> 
>     # Notice different indent from your code
>     mbrPhone = open('mbrPhone.txt', 'w')
>     mbrPhone.write(indent(Results, hasHeader=False, separateRows=True))
>     mbrPhone.close()
> 

O.k., I'm curious about the indentation issue here.  There is only one file,
and it has the correct information - looking at it from a text editor.  Is
my version overwriting the file every time it iterates then?  You'll get a
laugh out of this, because when I was playing with sending the file to the
printer, I did not dedent the printer call, and it did try to print a copy
of the file for each record.  

Needless to say, I learned the command "lprm" Saturday! I caught onto the
indentation, which fixed that.  However, I did not pay attention to the code
above - probably because I don't have 50-something files named
mbrPhone*.txt.  Go ahead and laugh, I did!

> > 
> > I first assumed that "record", and then "Results" could be substituted
> > for"rows", per the recipe.  I also tried "rows", and assigning "record",
> > and then "Results" to "rows".  O.k., you can laugh all you want.  I
> > tried playing with the various arguments, and found that to be of little
> > value.
> > 
> > The traceback refers to a type error: iteration over a non-sequence. 
> > The query returns a tuple, as I understand it.  I also understand a
> > tuple to be a sequence.  If this is really as simple as the 3 lines you
> > pointed out above, I know I'm missing something in the implementation.
> 
> Yes, a tuple is a sequence. If you still get an error with the code above,
> please post the exact error message and traceback (copy / paste from the
> output), there is a lot of useful information in it that can be lost if
> you paraphrase.
> 
> Kent
> 

O.k.,

Here we go.  Global name "rows" is not defined.  My guess is that "rows"
needs to know that it should be holding "Results", but maybe it should
already know that.  I tried to say rows = Results, but that did not help.
This seems to come back to the difficulty I have with passing arguments
around.

### Revised Code ###
    print 'Phone List'
    for record in Results:
        print '%-15s\t%-15s\t%-15s' % record
    # rows = Results did not work
    mbrPhone = open('mbrPhone.txt', 'w')
    mbrPhone.write(indent(rows, hasHeader=False, separateRows=False,
                              prefix='| ', postfix=' |'))
    mbrPhone.close()


### Traceback ###
Traceback (most recent call last):
  File "ekklesia.py", line 165, in ?
    Main()
  File "ekklesia.py", line 160, in Main
    RunMenu(Menu_Main)
  File "ekklesia.py", line 31, in RunMenu
    if len(MenuList[sel]) == 3: MenuList[sel][1](MenuList[sel][2])
  File "ekklesia.py", line 32, in RunMenu
    else: MenuList[sel][1]()
  File "/home/donp/python/ekklesia/ekklesia_db.py", line 61, in mbr_Phone
    mbrPhone.write(indent(rows, hasHeader=False, separateRows=False,\
NameError: global name 'rows' is not defined


BTW, I really appreciate your patience and willingness to help me understand
this.  If I had ever dreamed that I would have a desire to program 20 years
after the fact, I would have stopped passing notes in Math class.  I do it
well, but hate it.  Yet, I find myself drawn further and further into the
code, actually wanting to know more about it - why it does what it does.

Don
-- 
evangelinux    GNU Evangelist
http://matheteuo.org/                   http://chaddb.sourceforge.net/
"Free software is like God's love - you can share it with anyone anytime
anywhere."


More information about the Tutor mailing list