我正在努力解决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)