我无法理解为什么这不起作用 - 我的循环很好地适用于第一次迭代但是然后停止 - 每次都打印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)
答案 0 :(得分:1)
Python中的许多可迭代对象 - 你可以在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文件。实际上,尽管有这个名字,它实际上更像是一个“转换器”:它从一些来源获取文本行,这可能是任何东西,并将它们逐个转换为列表。在读者转换了一行之后,它会忘记它。这允许读者对象处理数百万行而不占用大量内存。
这种方法的权衡是读者对象不能回到它之前处理过的行,除非它能以某种方式告诉它的文本来源返回并重复前一行。但是无法保证底层来源可以做到这一点。例如,如果源是某些其他程序的输出,则无法告诉程序返回并重复旧的输出行。或者,如果源是通过Internet流式传输的文本,则无法告诉它重复之前已流式传输的行。因此,读者不能指望能够访问旧行,这就是为什么当它到达最后一行时,唯一合理的行为就是让它像没有任何东西一样行动。