2012-07-24 65 views
4

我看不到这里的问题,它让我疯狂。我正在循环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循环后for循环注释掉其他它遍历整个第一文件

+1

值得注意的是,为了达到这个目的,“f + = 1”需要缩进一级 - 我认为这是一个复制错误。 – 2012-07-24 16:18:23

+0

@Lattyware正确的复制错误感谢您指出这一点 – adohertyd 2012-07-24 16:19:37

+0

您是比较两个文件中的所有行50次?我以为你想找到50场比赛.. – 2012-07-24 16:22:54

回答

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

+0

谢谢你。我一直在想这个!我知道这不是最有效的代码,但它仅用于测试目的,所以我只需要它的工作。谢谢 – adohertyd 2012-07-24 16:18:43

+0

目前还不清楚你是否只是比较匹配线。如果你只想比较匹配的行,你可能想使用'zip(file_1,file2)'并迭代它。 – Julian 2012-07-24 16:19:54

+0

@Julian我其实在做每一个匹配和不匹配的行用于统计目的的数量,使得有每一行从每个文件 – adohertyd 2012-07-24 16:21:16

4

问题可能是,一旦你重复了file2,它已经耗尽,所以你的内循环不再执行(因为file2中没有任何内容可以迭代)。您可以每次通过循环关闭/重新打开file2,或者可以在执行循环之前回溯到开始。

一个稍微好一点的方法是使用集(如果文件不是太大,你不担心文件或命令中重复):

matches = set(file1).intersection(file2) 

这应该只读文件1成内存,并隐式执行file2上的循环。

+0

你不需要直接创建他们两个,你可以使用'设置(文件1).intersection(文件2)',你只需要在内存中创建一个'set'。 – Julian 2012-07-24 16:22:30

+0

@Julian - 好点。我会更新。 – mgilson 2012-07-24 16:23:47

1

之后的第一时间内循环结束后,在文件2内迭代器到达最终使该解决方案是指文件2的内部迭代,每次到文件的开头,例如:

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

你先生,救了我一天 – 2014-08-21 08:45:28

0

根据您可以使用readlines()函数将每个文件的行读取到列表中。

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