Chris Castillo wrote:
Oh okay. gotcha.
so I have what I want basically. I just need to check to see if each number meets a certain criteria and output something like the following to a text file. Should I be going about this a different way or should I still use lists?

bob  below average
sue  above average
jim  perfect



On Thu, Jul 16, 2009 at 4:12 AM, Christian Witts <cwi...@compuscan.co.za <mailto:cwi...@compuscan.co.za>> wrote:

    Chris Castillo wrote:

        why does your 3rd and fourth lines have brackets?

        On Thu, Jul 16, 2009 at 1:08 AM, Christian Witts
        <cwi...@compuscan.co.za <mailto:cwi...@compuscan.co.za>
        <mailto:cwi...@compuscan.co.za
        <mailto:cwi...@compuscan.co.za>>> wrote:

           Chris Castillo wrote:

               I'm having some trouble reading multiple data types from a
               single text file.

               say I had a file with names and numbers:

               bob
               100
               sue
               250
               jim
               300

               I have a few problems. I know how to convert the lines
        into an
               integer but I don't know how to iterate through all the
        lines
               and just get the integers and store them or iterate through
               the lines and just get the names and store them.

               please help.
------------------------------------------------------------------------

               _______________________________________________
               Tutor maillist  -  Tutor@python.org
        <mailto:Tutor@python.org> <mailto:Tutor@python.org
        <mailto:Tutor@python.org>>

               http://mail.python.org/mailman/listinfo/tutor
You could do it with a list comprehension

           >>> names = []
           >>> numbers = []
           >>> [numbers.append(int(line.strip())) if
        line.strip().isdigit()
           else names.append(line.strip()) for line in
        open('test.txt','rb')
           if line.strip()]
           [None, None, None, None, None, None]
           >>> names, numbers
           (['bob', 'sue', 'jim'], [100, 250, 300])

           The list comprehension would unfold to

           for line in open('test.txt', 'rb'):
             if line.strip():
                 if line.strip().isdigit():
                     numbers.append(line.strip())
                 else:
                     names.append(line.strip())

           And from there you can do what you like with the lists.

           --    Kind Regards,
           Christian Witts



    >>> [numbers.append(int(line.strip())) if line.strip().isdigit()
    else names.append(line.strip()) for line in open('test.txt','rb')
    if line.strip()]
    [None, None, None, None, None, None]

    Are you referring to these lines ?
    If so, the reason is that for Python to recognize it as a list
    comprehension it needs to be wrapped in square brackets, if you
    were to use () instead to wrap around it it would become a
    generator expression (something which is incredibly powerful for
    larger amounts of data as it iterates when it needs to instead of
    pre-building everything.  And the following line with the Nones on
    is because that is the output of the calls to .append.  Normally
    you wouldn't see it in your application though.

-- Kind Regards,
    Christian Witts



Ok, I see what you want to do now. The best case for this would be to unfold it into a proper loop instead to maintain readability

Name = None
Number = None
fOut = open('output.txt', 'wb')

for line in open('test.txt', 'rb'):
   line = line.strip()
   if line:
       if line.isdigit():
           Number = int(line)
           # Do whatever processing you want now
       else:
           Name = line

       if Name and Number:  # Checks to see if Name, Number have values
           fOut.write('%s\t%s\r\n' % (Name, Number))
           Name, Number = None, None
           # This is done so that you have to have a name and number
           # before writing to the file, it also then resets the
           # state of Name, Number to None before continuing

fOut.close()

What this will do is read in the file a line at a time, if the line is empty is continues to the next one without processing. If the line contains data it will check if it's numeric and if so populate the Number variable and if non-numeric populate the Name variable (gross assumption that it would indeed be a name and not something arbitrary like punctuation etc). Once both variables have been set that data would be written out to file for storing.

--
Kind Regards,
Christian Witts


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to