Python在嵌套循环中跳过内层循环

0 投票
3 回答
1761 浏览
提问于 2025-04-15 17:29

我正在用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)

撰写回答