2016-06-13 27 views
1

我有一個文件,我正在尋找一個名爲「$ INGGA」的特定sting。我的代碼用這個字符串打印所有行,但我也想從下一行開始。我如何去做這件事?我當前的代碼是:python從文本文件中獲得行+ 1

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

旁邊的文件對象 –

回答

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, 
+0

如果$ INGGA是最後一行呢? – Aquiles

+0

它不會被打印,'行'永遠不會到達文件的末尾('nextline'永遠不會包含第一行) –

+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 
+0

上所說的「最好」是在這種情況下,相當主觀的。對於我來說,我總是更喜歡使用'itertools'而不是程序循環(在幾次循環迭代中使用變量)。 –

+0

的確,可能應該說容易些。我會編輯;) – Aquiles

+0

我將如何將兩條線組合成一個新的字符串,即:「%INGGA 25,27,28,29在一行然後下一行」%INHDT 54,37, 48,我想做一個新的字符串「%INGGA 25,27,28,29,%INHDT 54,37,48」 –

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] 
+0

我不會推薦這個,你會將整個文件讀入RAM中。 –

+0

@Nils Werner有效點。 – Jeremy