6

我在这里看不到问题,这让我发疯。我正在循环浏览 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

4 回答 4

12

您不能在不寻找开始的情况下循环浏览一个文件,然后再次循环浏览同一个文件。

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

在您的特定情况下,使用 aset作为名称可能是最快的:

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 中的行都是唯一的。

于 2012-07-24T16:16:06.470 回答
4

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

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

matches = set(file1).intersection(file2)

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

于 2012-07-24T16:16:16.753 回答
3

第一次内循环结束后,file2上的内迭代器到达末尾,所以解决方法是每次将file2的内迭代器指向文件的开头,例如:

while f < 50:
    for line in file1:
        file2.seek(0, 0)
        for name in file2:
            if name == line:
                print 'match!'
于 2012-07-24T16:21:03.287 回答
0

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

然后,遍历这些列表。这将确保您对文件位置的当前位置没有问题。

于 2012-07-24T16:22:52.097 回答