如何在Python中打印缺失的行?

0 投票
3 回答
619 浏览
提问于 2025-04-18 14:39

我正在文件中查找特定的一行。如果我需要的那一行不存在,我想打印出“文件中缺少这一行”。比如,我的文件里包含以下内容:

 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 个回答

0
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'等等。

0

你绝对不应该把变量命名为 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")
2

第一个问题是,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"))

撰写回答