Python在嵌套循环中跳过内层循环
我正在用Python写一些代码来生成变量名,但不知道为什么我只得到了我需要的一部分。
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' % \
{ '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
但是输出的结果是:
AC1 100
AC1 101
0
1
2
我使用try/except的目的是为了捕捉CSV文件中任何空行或缺失的第二个字段。
看起来内部循环只在第一次执行时运行。导致这种情况的唯一原因我能想到的就是try/except,因为我做了一个互动示例来测试它。
3 个回答
0
第一次读取的时候,读入的缓冲区已经用完了,所以没有其他内容可以读取,因为你已经到达了文件的末尾。
你需要在循环之前先把文件读入。
1
确保参数是一个列表,而不是一个迭代器。
>>> s = (i for i in range(10))
>>> for ss in s: print(ss)
0
...
9
>>> for ss in s: print(ss)
# Nothing!
6
在外层循环的第一次运行中,你会读取所有来自params
的行。在第二次运行时,params
中的所有行已经被读取完了,所以内层循环就没有东西可以继续处理了。
为了解决这个问题,你可以把所有的数据集加载到一个列表中,然后再对这个列表进行循环:
reader = csv.reader(open('params.csv'), delimiter=',', skipinitialspace=True)
params = list(reader)