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: 
       # ...