开发者

python skipping inner loop in nested for loop

I am using some python to do some variable name generation. For some reason I am only getting part of what I need.

import sys
import csv

params = csv.reader(open('params.csv'), delimiter=',', skipinitialspace=True)

flags_r = []
flags_w = []
numbers_r = []
numbers_w = []
station = ['AC1','DC1','DC1']
drive = ['','Fld','Arm']

for i in range(3):
    for p in params:
        try:
            desc = p[1].split(' ')
            desc = [part.capitalize() for part in desc]
            desc = "".join(desc)
        except IndexError, e:
            print 'IndexError: %s' %(e,)
            continue
        print station[i],drive[i],p[0]
        flags_r.append( 'mod%(station)s_%(drive)sP%(param)04dr_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })
        flags_w.append( 'mod%(station)s_%(drive)sP%(param)04dw_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })
        numbers_r.append( 'mod%(station)s_%(drive)sP%(param)04drn_%(desc)s' % \
        开发者_JAVA百科                  { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })
        numbers_w.append( 'mod%(station)s_%(drive)sP%(param)04dwn_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })

    print i

params.csv:

100, Speed Reference
101, Speed Feedback

for some reason it is outputting:

AC1 100

AC1 101

0

1

2

the reason for the try/except is to catch any blank rows or missing second fields in the csv file.

It appears that the inner loop only get executed on the first pass. The only reason I can see for this to happen would be the try/except as I have done an interactive example to test it.


In the first iteration of the outer loop you read all lines from params. In the second iteration all the lines from params are already read, so there is nothing left to iterate over in the inner loop.

To work around this, you could load all the data sets into a list and then iterate over that list:

reader = csv.reader(open('params.csv'), delimiter=',', skipinitialspace=True)
params = list(reader)


Make sure params is a list and not an iterator.

>>> s = (i for i in range(10))
>>> for ss in s: print(ss)

0
...
9
>>> for ss in s: print(ss)

# Nothing!


on the first pass the reader buffer gets exhausted, so there is nothing else to read since you reached end of file.

You need to read your file in before the loops

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜