如果有任何先前的语句,为什么不调用for循环? (Python 2.7)

时间:2015-03-11 20:42:52

标签: python csv for-loop

读取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循环。没有那个循环,我无法找到有用和有趣的位

我在这里错过了什么?

2 个答案:

答案 0 :(得分:1)

你错过了Strings是一个迭代器。一旦你迭代它以获得长度,它就会耗尽。所以for循环现在无需操作。

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

strings = list(csv.reader(source))

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

答案 1 :(得分:0)

正如丹尼尔所说,问题是你正在迭代文件中的行。然而,正确的解决方案是回放文件:

Source.seek(0, 0)

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