[Tutor] iteration help

Mark Lawrence breamoreboy at yahoo.co.uk
Thu Aug 20 19:54:44 CEST 2015


On 20/08/2015 14:27, richard kappler wrote:
> Running python 2.7 on Linux
>
> While for and if loops always seem to give me trouble. They seem obvious
> but I often don't get the result I expect and I struggle to figure out why.
> Appended below is a partial script. Ultimately, this script will read a
> log, parse out two times from each line of the log, a time the line was
> written to the lg (called serverTime in the script) and an action time from
> elsewhere in the line, then get the difference between the two. I don't
> want every difference, but rather the average per hour, so I have a line
> count. The script will output the average time difference for each hour.
> I've got most of the pieces working in test scripts, but I'm stymied with
> the single output bit.

How do you write an if loop?

>
> The idea is that the script takes the hour from the server time of the
> first line of the log and sets that as the initial serverHr. That works,
> has been tested. Next the script is supposed to iterate through each line
> of the log (for line in f1) and then check that there is a time in the line
> (try), and if not skip to the next line. That works, has been tested.
>
> As each line is iterated over, my intent was that the variable newServerHr
> (read from the current line) is compared to serverHr and if they are the
> same, the script will increase the count by one and add the difference to a
> cummulative total then go to the next line. If the newServerHr and serverHr
> are not the same, then we have entered a new clock hour, and the script
> should calculate averages and output those, zero all counts and cummulative
> totals, then carry on. The idea being that out of 117,000 ish lines of log
> (the test file) that have inputs from 0200 to 0700, I would get 6 lines of
> output.
>
> I've got everything working properly in a different script except I get 25
> lines of output instead of 6, writing something like 16 different hours
> instead of 02 - 07.
>
> In trying to chase down my bug, I wrote the appended script, but it outputs
> 117,000 ish lines (times 02-07, so that bit is better), not 6. Can someone
> tell me what I'm misunderstanding?
>
> #!/usr/bin/env python
>
> import re
>
> f1 = open('ATLA_PS4_red5.log', 'r')
> f2 = open('recurseOut.log', 'a')
>
> # read server time of first line to get hour
> first_line = f1.readline()
> q = re.search(r'\d\d:\d\d:\d\d', first_line)
> q2 = q.start()
> serverHr = (first_line[q2:q2+2])

Are you absolutely certain that this will always be set correctly?

>
>
> for line in f1:
>      try:
>          s = line

The line above does nothing effective so remove it.

>          #    read server time
>          a = re.search(r'\d\d:\d\d:\d\d', s)  # find server time in line
>          b = a.start()                        # find 1st position of srvTime
>          newServerHr = (s[b:b+2])          # what hour is it now?
>          if newServerHr != serverHr:
>              f2.write('hour ' + newServerHr + '\n')
>          else:
>              serverHr == newServerHr

Is it possible that lines don't contain a valid time in which case b 
will be -1? Your slice will run from -1, the last character in the line, 
to +1, i.e. an empty string "".

>
>      except:
>          pass
>

Remove the try and plain except as it'll mask any problems that you get 
in the code.  It also prevents CTRL-C or similar from breaking infinite 
loops that you've accidentally written.

-- 
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence



More information about the Tutor mailing list