我在这里看不到问题,这让我感到疯狂。我正在循环浏览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循环它循环遍历整个第一个文件
答案 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()
功能将每个文件的行读入列表。
然后,迭代这些列表。这将确保您不会遇到文件位置的当前位置问题。