python从文本文件中获取行+ 1

时间:2016-06-13 14:16:01

标签: python string file text

我有一个文件,我正在寻找一个名为“$ INGGA”的特殊刺痛。我的代码用这个字符串打印所有行,但我也想要下一行的字符串。我该怎么做呢?我目前的代码是:

with open(nmea) as nmeafile:
    for num, line in enumerate(nmeafile, 1):
        if "$INGGA" in line:
            print line
            # add code to print the line+1

非常感谢

菲尔

3 个答案:

答案 0 :(得分:1)

这里更简单的解决方案是放置一个条件,以便在迭代器中轮到它时打印下一行。因为如果你试图在它之前打印它可能不存在(即如果$ INGGA是最后一行)

should_print, text = False, ''
with open(nmea) as nmeafile:
    for num, line in enumerate(nmeafile, 1):
        if should_print:
            print '{0}, {1}'.format(text, line)
            should_print = False
        if "$INGGA" in line:
            should_print, text = True, line

答案 1 :(得分:0)

这是我首选的方法。将行读入列表,然后迭代直到倒数第二个元素,防止您尝试打印不存在的行。

with open("info.txt") as f:
    lines = f.readlines()
    for i in xrange(len(lines)-1):
        if "$INGGA" in line:
            print lines[i]
            print lines[i+1]

答案 2 :(得分:0)

您可以使用itertools食谱pairwise,它会在每次迭代时产生当前和下一行。你检查第一个并产生两者。

对于文件

asd
hello
$INGGA
argh
fpp
$INGGA
cake
sausage

它会返回

$INGGA
argh
$INGGA
cake

所有处理都是在RAM之外完成的(文件是逐行读取和处理的),并且没有程序变量(在一次迭代中设置一个标志,在下一次重置时)。

from itertools import tee, izip

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)


def ingga(nmeafile):
    for line, nextline in pairwise(nmeafile):
        if "$INGGA" in line:
            yield line
            yield nextline

with open("nmea") as nmeafile:
    for i in ingga(nmeafile):
        print i,

或者,如果您不需要可重复使用的功能

with open("nmea") as nmeafile:
    for line, nextline in pairwise(nmeafile):
        if "$INGGA" in line:
            print line,
            print nextline,