我正在努力解决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))
是的,它有效,但这个黑客不是一个好的解决方案。
答案 0 :(得分:2)
您打开文件get_data()
,然后对其进行迭代(读取),而不将文件重置为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)
实现的。
答案 1 :(得分: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)