我有一个文件,我正在寻找一个名为“$ 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
非常感谢
菲尔
答案 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,