如何初始化"for row in file"循环?



我正在努力解决python的"for"初始化问题。我想检测文本文件中缺少数字,例如:

1001 :foo foo
1002 :foo foo
1004 :foo foo
1006 :foo foo
1007 :foo foo
1008 :foo foo

从此文件中,应检测到缺少 1003 和 1005。这是我的代码:

import sys
import os
args = sys.argv
if (len(args) < 4):
    print("Invalid args")
path = args[1]
numstart = int(args[2])
numend = int(args[3])
with open(path, mode='r') as f:
    for numfind in range( numstart, numend ):
        for row in f:
            flag = row.find(str(numfind))
            if (flag != -1):
                print("found: " + str(numfind))
                break
        else:
            print("Not found: " + str(numfind))

我希望从第一行扫描f每循环for row in f但我是这样的:

Found: 1001
Found: 1002
Not found: 1003
Not found: 1004
Not found: 1005
Not found: 1006
Not found: 1007
Not found: 1008

而且我认为没有循环for rows in f迭代。这有效:

for numfind in range( numstart, numend ):
    with open(path, mode='r') as f:
        for row in f:
            flag = row.find(str(numfind))
            if (flag != -1):
                print("found: " + str(numfind))
                break
        else:
            print("Not found: " + str(numfind))

是的,它有效,但这个黑客不是一个好的解决方案。

打开文件f,然后迭代(读取它(,而不将文件重置为for循环之间的初始位置,f.seek(0) .在第一个for row in f之后,f将没有更多的行要读取,所以它基本上变成了一个无操作(以及为什么你看不到迭代(。你想要:

with open(path, mode='r') as f:
    for numfind in range( numstart, numend ):
        for row in f:
            flag = row.find(str(numfind))
            if (flag != -1):
                print("found: " + str(numfind))
                break
        else:
            print("Not found: " + str(numfind))
        f.seek(0)

第二种方法通过在循环中打开文件来工作的原因是,您在每个循环中从第一行重新读取文件,这就是我们通过添加上面的f.seek(0)来实现的。

这是你要找的吗?

counter = numstart
with open(path, mode='r') as f:
    for row in f:
        if count == numend:
            break
        if str(counter) not in row:
            print('Not found: ' + str(counter))
        counter += 1

更简单:

with open(path, mode='r') as f:
    not_found = [n for line, n in zip(f, range(numstart, numend)) if str(n) not in line]
print(not_found)

最新更新