繁体   English   中英

for循环在第一次迭代后停止-python

[英]for loop stops after first iteration - python

我不明白为什么这行不通-我的循环在第一次迭代中运行良好,然后又停止了-print x [0]每次都可以运行,但是下一个嵌套的for循环仅在第一次时运行...有什么想法吗?

    csv_reader=csv.reader(guuids, delimiter='\t')   
    matrix_reader=csv.reader(matrix, delimiter='\t')        

    for line in csv_reader:
            x = line
            print x[0]
            for mline in matrix_reader:
                    if x[0] in mline[0] or x[0] in mline[1]:
                            out.append(mline)

Python中的许多可迭代的对象-的东西,你可以把后in一个for循环-只能使用一次遍历。 之后,他们就完成了; 它们不能返回到开始,并且任何进一步遍历它们的尝试都将像它们不包含任何内容一样起作用。 一个csv.reader对象就是一个例子:在外循环的第一个迭代中,您遍历matrix_reader可以提供的所有可用记录。 这就是为什么下一次代码出现在那一行时,好像matrix_reader为空。

解决此问题的最简单方法也许是每次您要对其进行迭代时都创建一个新的matrix_reader 像这样:

for line in csv_reader:
    matrix_reader = ...
    for mline in matrix_reader:
        ...

要理解为什么csv.reader被累死你去了之后,通过一次,你应该知道,一个csv.reader 并不代表一个CSV文件。 实际上,尽管有名称,它实际上更像是一个“转换器”:它从某些来源(可能是任何来源)获取文本行,并将它们一行一列地转换成列表。 读者转换了一行之后,便会忘记它。 这使阅读器对象可以处理数百万行,而无需占用大量内存。

这种方法的折衷之处在于,除非读者对象能够以某种方式告诉其文本源返回并重复上一行,否则它无法返回到它之前已经处理过的行。 但是,不能保证基础源可以做到这一点。 例如,如果源是其他程序的输出,则不能告诉该程序返回并重复旧的输出行。 或者,如果源是通过互联网流式传输的文本,则不一定要告诉它重复以前流式传输的行。 因此,读者不能指望能够访问旧行,这就是为什么,当到达最后一行时,唯一合理的行为是使它好像什么都没剩下一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM