python中的嵌套循环失败
很抱歉问了一个愚蠢的新手问题,但我的嵌套循环无法工作。它只返回第一次迭代。我错过了什么 我试图在我的主文件中搜索多个字符串。我想我弄乱了缩进,但我尝试的所有变化都返回了错误python中的嵌套循环失败,python,Python,很抱歉问了一个愚蠢的新手问题,但我的嵌套循环无法工作。它只返回第一次迭代。我错过了什么 我试图在我的主文件中搜索多个字符串。我想我弄乱了缩进,但我尝试的所有变化都返回了错误 f = open('GRCh37_genes_all_mod.txt', 'rU') # main search file f1 = open('genes_regions_out.txt', 'a') #out file f2 = open('gene_list.txt', 'r') # search list for
f = open('GRCh37_genes_all_mod.txt', 'rU') # main search file
f1 = open('genes_regions_out.txt', 'a') #out file
f2 = open('gene_list.txt', 'r') # search list
for gene in f2:
for line in f:
if gene in line:
print line
f1.write(line)
一个文件只能迭代一次。第一次通过
f
之后,下次尝试为f中的行运行,将不会获得任何内容
如果要多次遍历文件内容,可以将该内容放入列表中
with open('GRCh37_genes_all_mod.txt', 'rU') as f:
contents = list(f)
with open('gene_list.txt', 'r') as f:
genes = list(f)
for gene in genes:
for line in contents:
...
在第一次迭代之后,文件指针位于文件末尾,迭代器将耗尽(调用next(f)
将引发StopIteration
)
对于这种情况,最简单的解决方案是使用f.seek(0)
重置文件指针:
对于其他iterable(可能不“可重置”),如果您知道需要多少“副本”,可以使用itertools.tee()
,或者,如果您知道iterable是有限的(有些iterable是无限的),并且它的所有内容都可以放在内存中,您可以按照Khelwood的解释列出一个列表。您必须首先使用f2中的基因的单独迭代这些行。readlines():
和f
@meowgoestedog:哦,是的。)谢谢你的邀请link@brunodesthuilliers请随意发布备选答案。谢谢大家。现在我有了工作循环。我已经测试了@khelwood answer,这解决了我的问题。在将所有内容读入内存的同时,也可以通过简单地倒带文件来完成,这样会占用更少的内存。两个答案都修复了我最初的错误。非常感谢。但现在这两种方法都有一个额外的结果,即在给我正确的结果后,将不匹配的结果转储到输出中。
for gene in f2:
f.seek(0)
for line in f:
# ...