【问题标题】:python skipping inner loop in nested for looppython在嵌套for循环中跳过内部循环
【发布时间】:2010-12-31 05:59:48
【问题描述】:

我正在使用一些 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,因为我已经做了一个交互式示例来测试它。

【问题讨论】:

    标签: python nested-loops


    【解决方案1】:

    在外循环的第一次迭代中,您从params 中读取了所有行。在第二次迭代中,来自params 的所有行都已被读取,因此内部循环中没有任何可迭代的内容。

    要解决这个问题,您可以将所有数据集加载到一个列表中,然后遍历该列表:

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

    【讨论】:

    • 我喜欢python,但我仍然不习惯思考它。迭代器!= []
    • 或者,如果您想每次都从文件中重新读取而不是将值存储在内存中,请将 reader=csv.reader(...) 放在外循环中。
    【解决方案2】:

    确保 params 是一个列表而不是迭代器。

    >>> s = (i for i in range(10))
    >>> for ss in s: print(ss)
    
    0
    ...
    9
    >>> for ss in s: print(ss)
    
    # Nothing!
    

    【讨论】:

      【解决方案3】:

      在第一次通过时,读取器缓冲区已用尽,因此自从您到达文件末尾后就没有其他内容可读取了。

      你需要在循环之前读入你的文件

      【讨论】:

      • 这就是我所说的“读入”。我会改为“循环”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多