Nested For loop not running full

Peter Otten __peter__ at web.de
Fri Apr 26 05:51:05 EDT 2013


inshu chauhan wrote:

> On Fri, Apr 26, 2013 at 2:39 PM, Peter Otten <__peter__ at web.de> wrote:
> 
>> inshu chauhan wrote:
>>
>> > I have this part of my code where I am trying to traverse over an image
>> by
>> > running a for loop for both x and y co-ordinate axis. But the loop is
>> > terminating by just reading first pixel. Can think of a reason why this
>> is
>> > happening ?
>> >
>> > The code is:
>> > for sy in xrange(0, segimage.height):
>> >     for sx in xrange(0, segimage.width):
>> >             if segimage[sy,sx] == (0.0, 0.0, 0.0):
>> >                 continue
>> >             else:
>> >                 seg_color = segimage[sy,sx]
>> >                 blue = int(seg_color[0])
>> >                 green = int(seg_color[1])
>> >                 red = int(seg_color[2])
>> >                 reg_num = blue + 256 * green + 65536 * red
>> >                 for l in f:
>> >                     sp = l.split(",")
>> >                     if len(sp) == 14:
>> >                         print sy, sx  # for checking which pixel its
>> > reading currently
>> >                         print reg_num, sp[0]  # for checking whats
>> > happening
>> >                         if reg_num == int(sp[0].strip()):
>> >                             print reg_num, sp[0].strip() # for checking
>> > whats happening
>> >                             classification = int(sp[13].strip())
>> >
>> >
>> > The inside "for loop" is for reading a csv format file from which I am
>> > extracting some information.
>>
>> My crystal ball says that the 'for sy...' and 'for sx...' loops are
>> running to completion, but you don't get the coordinates printed because
>> you put them into the 'for l in f' loop which will only run once.
>>
> 
> Is there any means by which I can run this 'For l in f' loop again and
> again ?
> 
>>
>> The quick and dirty fix is to replace
>>
>> f = open(...)
>>
>> in the code you are not showing with
>>
>> f == list(open(...))
>>
> 
> f is just a text file(csv format).. so why list ??

Can you figure it out yourself from the following?

>>> f = open("tmp.data")
>>> for i in range(3):
...     for line in f: print repr(line)
... 
'alpha\n'
'beta\n'
'gamma\n'
>>> f = list(open("tmp.data"))
>>> for i in range(3):
...     for line in f: print repr(line)
... 
'alpha\n'
'beta\n'
'gamma\n'
'alpha\n'
'beta\n'
'gamma\n'
'alpha\n'
'beta\n'
'gamma\n'

>> The reasonable thing to do is of course to move the preprocessing (e.g.
>> csv-
>> parsing) out of the sy and sx loops.
>>
> 
> I did this but again then what I intend to do is not really happening, For
> every pixel I read,  I want to traverse the full file, so that the
> information I am taking from pixel have to match in one of the line in the
> file. Can this be done by modifying my code ? or something new has to be
> devised ?

I think I have already answered this, but here's another alternative:

>>> f = open("tmp.data")
>>> for i in range(3):
...     f.seek(0)
...     for line in f: print(repr(line))
... 
'alpha\n'
'beta\n'
'gamma\n'
'alpha\n'
'beta\n'
'gamma\n'
'alpha\n'
'beta\n'
'gamma\n'





More information about the Python-list mailing list