如何在Python中打印缺失的行?
我正在文件中查找特定的一行。如果我需要的那一行不存在,我想打印出“文件中缺少这一行”。比如,我的文件里包含以下内容:
list 0
list 7
list 2
list 5
这是我到目前为止写的代码:
fo=open(filename,"r")
for i in range(0,6):
str="list"+str(i)
for line in fo.readlines():
if not str in line:
print "%s%s" %(str,"is missing in file"
请大家帮帮我
3 个回答
with open(filename,'r') as infile:
inlines=infile.readlines()
for term in xrange(0,10):
line='list %d\n' % term
if line not in inlines:
print line,'is not in the file'
//注意,这个是把整个搜索字符串和输入行进行匹配。我想你是这个意思,而不是在输入行中查找搜索词,因为如果你在行中查找'line 1',那么会匹配到'line 1'、'line 10'、'line 1000'等等。
你绝对不应该把变量命名为 str
,因为 str
是 Python 中的一个内置类型。还有,你试图把 list
(这是一个函数和类型)和一个字符串连接在一起。其实你应该把字符串 'list '
和数字的字符串形式连接起来。你在那个地方调用 readlines()
是不必要的。更好的做法是,提前把文件读入一个列表,然后遍历这个列表。
fo=open(filename,"r").readlines()
for i in range(0,6):
s = 'list ' + str(i)
foundline = False
for line in fo:
if s in line:
foundline = True
break
if not foundline:
print "%s%s" % (s,"is missing in file")
第一个问题是,list+str(i)
这个写法是行不通的,除非你之前定义过 list = 'list '
这样的变量。
第二个问题是,你把变量命名为 str
,这样就把内置的 str
函数给隐藏了,这样在循环的下一次你就不能再调用这个函数了。
第三个问题是,你只打开文件一次,但却调用了 readlines()
7 次。第一次读取后,文件里就没有更多的行可以读了,所以之后会返回一个空列表。你应该在循环外面调用一次并把结果存起来,比如 lines = fo.readlines()
。或者,你也可以在每次循环时重新打开文件,而不是只打开一次。
第四个问题是,你的 print
语句缺少一个 )
。
最后,你的问题标签里有 python-2.7 和 python-3.x。我假设你不是随便加标签希望能吸引更多人,而是真心希望你的代码能在这两个版本上都能运行。在这种情况下,你不能把 print
当作语句来用,而是要把它当作函数来用。
那么,怎么说“如果字符串不在任何一行中”呢?简单的方法是用 any
函数:
if not any(s in line for line in lines):
如果你不明白这个,可以通过显式写出循环来达到同样的效果,像这样:
found = False
for line in lines:
if s in line:
found = True
break
if not found:
还有很多其他问题你应该去修复(例如,关闭文件——最好使用 with
语句;尽量避免使用 readlines
;等等),但没有更多是你必须修复的。所以,这里有一个经过最小修改的可运行版本:
fo=open(filename,"r")
lines = fo.readlines()
for i in range(0,6):
s='list '+str(i)
if not any(s in line for line in lines):
print("%s%s" %(s,"is missing in file"))