我正在使用一些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,因为我已经做了一个交互式示例来测试它。
答案 0 :(得分:6)
在外循环的第一次迭代中,您将读取params
中的所有行。在第二次迭代中,params
的所有行都已被读取,因此在内部循环中没有任何内容可以迭代。
要解决此问题,您可以将所有数据集加载到列表中,然后遍历该列表:
reader = csv.reader(open('params.csv'), delimiter=',', skipinitialspace=True)
params = list(reader)
答案 1 :(得分:1)
确保params是一个列表而不是迭代器。
>>> s = (i for i in range(10))
>>> for ss in s: print(ss)
0
...
9
>>> for ss in s: print(ss)
# Nothing!
答案 2 :(得分:0)
在第一次传递时,阅读器缓冲区耗尽,因此在您到达文件末尾时没有其他任何内容可供阅读。
您需要在循环之前读取您的文件