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

2024-03-29 12:16:25 发布

您现在位置: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)

Tags: orcsvinforiflineoutmatrix
1条回答
网友
1楼 · 发布于 2024-03-29 12:16:25

Python中的许多iterable对象(可以放在for循环中in之后的对象)只能迭代一次。在那之后,它们就完成了;它们不能回到开头,任何进一步的迭代尝试都将表现为它们不包含任何内容。一个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文件。实际上,尽管它的名字,它实际上更像是一个“转换器”:它从某个源获取文本行,可以是任何内容,然后逐个将它们转换成列表。当读者转换了一行字之后,它就会忘记它。这使得reader对象可以在不占用大量内存的情况下处理数百万行。在

这种方法的折衷是reader对象不能返回到它以前处理过的行,除非它能够以某种方式告诉它的文本源返回并重复上一行。但不能保证潜在来源能做到这一点。例如,如果源代码是其他程序的输出,则不能让程序返回并重复原来的输出行。或者,如果源是通过互联网传输的文本,则不一定要让它重复之前流过的行。所以读者不能指望能够访问旧的行,这就是为什么,当它到达最后一行时,唯一合理的行为就是让它表现得好像什么都没有了。在

相关问题 更多 >