16

我有一个文件,我想一次获取每一行,但是一旦它到达特定的行,我需要获取接下来的几行信息。

这是一个代码示例:

rofile = open('foo.txt', 'r')
for line in rofile:
    print line
    if(line.strip() == 'foo'):
        line = line.next()
        print line
        line = line.next()
        print line
        line = line.next()
        print line

当我第二次回来循环时,第一个打印语句应该打印文件中的第 5 行。有没有办法做到这一点?

编辑:很抱歉没有澄清细节。rofile是我正在迭代的文件对象。是否next()是使用文件时获取下一行的真正方法,我不知道。我对 python 中的文件操作没有太多经验。

4

5 回答 5

15

您可以使用iter将您的对象转换为支持next.

irofile = iter(rofile)
for line in irofile:
    print line
    if(line == 'foo'):
        line = next(irofile)  #BEWARE, This could raise StopIteration!
        print line

正如评论中所指出的,如果您的对象已经是一个迭代器,那么您无需担心iter(对象就是这种情况file)。但是,我将它留在这里,因为它适用于任何任意可迭代(例如lists)的情况。

于 2012-11-26T19:53:21.893 回答
2

根据对象的类型rofile,我可以想到几种方法来做到这一点。

字符串列表

如果您可以将其简单地视为构成文件行的字符串列表:

for index, line in enumerate(rofile):
   if line == 'foo':
       for a in range(index, index + HOW_MANY_LINES_YOU_WANT):
           print rofile[a]

可迭代

如果文件已经是可迭代的:

for line in rofile:
    print line
    if line == 'foo':
        for a in range(3): # Just do it 3 times
            print line.next()
            # After this happens and the for loop is restarted,
            # it will print the line AFTER

您可以在我写的这个快速示例中看到,它将以这种方式作为可迭代对象工作:

>>> k = iter([1,2,3,4])
>>> for a in k:
    print 'start loop'
    print a
    if a == 2:
        print 'in if'
        print k.next()
        print 'end if'
    print 'end loop'


start loop
1
end loop
start loop
2
in if
3
end if
end loop
start loop
4
end loop
于 2012-11-26T20:04:59.990 回答
1

for如果您实际上不想每一行都做某事,请不要使用循环。一种选择可能是:

try:
    while True:
        line = file.next()
        #do stuff
        if line == 'foo':
            #do other stuff
except(StopIteration):
     #go on with your life
于 2012-11-26T20:07:05.760 回答
0

这是对文件对象执行此操作的简单方法:

with open('foo.txt', 'r') as rofile:
    for line in rofile:
        print line,
        if line.strip() == 'foo':
            for _ in xrange(3):  # get the next 3 lines
                try:
                    line = rofile.next()
                except StopIteration:
                    break
                print line,

如果在看到 'foo' 行后没有 3 行,则需要 try/except。

于 2012-11-26T23:28:23.343 回答
0

我遇到了类似的问题,并且使用该continue语句代替了我的情况

于 2016-11-03T10:20:32.720 回答