【问题标题】:Why is this for loop not called if there are any preceding statements? (Python 2.7)如果前面有任何语句,为什么不调用这个 for 循环? (Python 2.7)
【发布时间】:2015-05-13 20:27:28
【问题描述】:

阅读 csv,我发现如果我的 with 块中有任何前面的语句,我将无法遍历行。

例如,如果我这样做:

with open (TargetFile) as source:
        Strings = csv.reader(source)
        for row in Strings:
            print Strings.line_num 

我会将整数 1 -(行数)打印到控制台。 (没用,是的,但我只是用明显的东西测试for。)

但是,假设我要随机抓取一行。我想首先确定行数并在该范围内生成一个随机数,然后遍历行以搜索匹配的 line_num。

(在这里,我保留了无用的print Strings.line_num 以避免引入新的错误。)

    with open (TargetFile) as source:
        Strings = csv.reader(source)       
        CSV_Length = sum(1 for row in Strings)
        print CSV_Length
        RandRow = random.randrange(1,CSV_Length)
        print RandRow
        for row in Strings:
            print Strings.line_num
            #replace ^ with actually useful code

会将 csv 文件中的行数和该范围内的随机整数打印到控制台 - 一切都符合预期 - 但不会调用(以前工作的)for 循环。没有那个循环,我就无法找到有用和有趣的部分

我在这里错过了什么?

【问题讨论】:

    标签: python csv for-loop


    【解决方案1】:

    正如丹尼尔所说,问题在于您正在遍历文件中的行。然而,正确的解决方案是倒带文件:

    Source.seek(0, 0)
    

    这会让你回到文件的开头。

    【讨论】:

      【解决方案2】:

      您错过了 Strings 是一个迭代器。一旦你迭代它以获得长度,它就会被耗尽。所以 for 循环现在没有什么可操作的了。

      您可以通过立即转换为列表来解决此问题:

      strings = list(csv.reader(source))
      

      完成此操作后,您现在可以访问 len(strings) 以获取长度。

      【讨论】:

      • 哦,我不知道迭代器会这样。有趣的!这不会消除我对 line_num 进行测试的能力吗?我不相信列表有这个属性。
      • 是的,但是你可以使用更明确的枚举:for line_num, row in enumerate(strings)
      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 2020-06-11
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多