简单嵌套for循环无法正常工作

时间:2012-07-24 16:14:45

标签: python file-io for-loop

我在这里看不到问题,这让我感到疯狂。我正在循环浏览2个文本文件。每个文件中的某些行匹配,有些则不匹配。我正在做的是循环file1。对于该文件中的每一行,循环遍历file2并比较每个元素以查看它们是否相同。发生的事情是我的循环在第一次循环通过file1后停止。这是我的代码:

while f < 50:
    for line in file1:
        for name in file2:
            if name == line:
                print 'a match was found'
    f+=1

while循环来自其他地方,但它工作正常。我只是把它包含在上下文中。问题是file1只给我第一行,将它与file2中的所有'名称'进行比较然后停止而不是重复file1中下一行的进程。我错过了一些明显的东西吗?

编辑:如果我在第一个for循环之后放入一个print语句并注释掉另一个for循环它循环遍历整个第一个文件

4 个答案:

答案 0 :(得分:9)

您无法循环浏览文件,然后再次循环访问同一文件而无需开始。

重新打开file2,在file2上调用.seek(0)或将所有行加载到列表中,然后循环遍历它。

在您的具体情况下,使用set作为名称可能是最快的:

names = set(name.strip() for name in file2)
while f < 50:
    for line in file1:
        if line.strip() in names:
            f += 1

您可以对file1中的行执行相同操作并执行集合交集,前提是行在file1和file2中都是唯一的。

答案 1 :(得分:4)

问题可能是,一旦你迭代file2,它就会耗尽,所以你的内部for循环不会再执行了(因为file2中没有任何内容可以迭代)。您可以在每次循环时关闭/重新打开file2,也可以在执行该循环之前回到开头。

稍微好一点的方法是使用集合(如果文件不是太大而且您不关心文件或订单中的重复项):

matches = set(file1).intersection(file2)

这应该只将file1读入内存并隐式地对文件2进行循环。

答案 2 :(得分:1)

第一次内部循环完成后,file2上的内部迭代器到达结尾,因此解决方案是每次将file2的内部迭代器指向文件的开头,例如:

while f < 50:
    for line in file1:
        file2.seek(0, 0)
        for name in file2:
            if name == line:
                print 'match!'

答案 3 :(得分:0)

根据文件的大小,您可以使用readlines()功能将每个文件的行读入列表。

然后,迭代这些列表。这将确保您不会遇到文件位置的当前位置问题。