2013-02-08 35 views
-3

我有文件閱讀不同的上下文中幾行相同行的匹配後在python

Header 1 
line 1 
line 2 
line 3 
line 4 
Header 2 
line 1 
line 2 
line 3 
line 4 

我想讀頭1然後讀線3和4在其下方,之後,我想讀頭2然後在不同的上下文中閱讀第3行和第4行。在這兩種情況下搜索第3行和第4行的字符串是相同的,但行不完全相同。目前我使用

for line in file  
    if "Header 1" in line: 

搜索標題1,我不能readline的內部使用這個文件的循環讀取的4條線的塊。

+0

你有什麼這麼遠嗎?它在做什麼,它不應該?或缺少哪些部分? – thegrinner 2013-02-08 13:15:44

+0

目前還不清楚你的意思是不同的背景。 – LtWorf 2013-02-08 13:28:52

+0

這個問題看起來很像這個:http://stackoverflow.com/q/14742446/989121 – georg 2013-02-08 13:44:42

回答

0

商店的所有線路,然後對它們進行分析:

data = open("filename.txt").readlines() 

這將可以很容易根據需要,從文件中讀取直線時,這是不正確的行之間跳躍。

0

unwind的答案適用於小文件。如果你想要一個通用的解決方案,堅持迭代器和生成器。

您可以定義一個生成器函數,它可以生成line_i,line_i + 3和line_i + 4的元組。

隨着進口

from collections import deque 
from itertools import islice 

我們可以定義一個新的發電機功能:

def reflexive_zip(iterator, offset = 0): 
    offset = int(offset) 
    if offset == 0: 
     for element in iterator: 
      yield (element, element) 
    else: 
     d = deque(islice(iterator,abs(offset))) 
     for element in iterator: 
      d.append(element) 
      if offset < 0: 
       yield (element, d.popleft()) 
      else: 
       yield (d.popleft(), element) 

它需要一個iterator,創建使用iterator的元件的deque和產量的元組的一些緩衝。偏移量可以通過參數offset進行控制。

這是完整的腳本。使用示例在主要部分。

if __name__ == "__main__": 
    from cStringIO import StringIO 

    f = StringIO("""Header 1 
line 1 
line 2 
line 3 
line 4 
Header 2 
line 1 
line 2 
line 3 
line 4""") 

    #for line, other_line in reflexive_zip(f, 4): 
    # print "%s -> %s" %(line, other_line) 

    for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3): 
     print "%s -> %s %s" %(line, line3, line4) 


from collections import deque 
from itertools import islice 

def reflexive_zip(iterator, offset = 0): 
    offset = int(offset) 
    if offset == 0: 
     for element in iterator: 
      yield (element, element) 
    else: 
     d = deque(islice(iterator,abs(offset))) 
     for element in iterator: 
      d.append(element) 
      if offset < 0: 
       yield (element, d.popleft()) 
      else: 
       yield (d.popleft(), element) 

if __name__ == "__main__": 
    from cStringIO import StringIO 

    f = StringIO("""Header 1 
line 1 
line 2 
line 3 
line 4 
Header 2 
line 1 
line 2 
line 3 
line 4""") 

    #for line, other_line in reflexive_zip(f, 4): 
    # print "%s -> %s" %(line, other_line) 

    for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3): 
     print "%s -> %s %s" %(line, line3, line4) 

輸出:

Header 1 
-> line 3 
    line 4 

line 1 
-> line 4 
    Header 2 

line 2 
-> Header 2 
    line 1 

line 3 
-> line 1 
    line 2 

line 4 
-> line 2 
    line 3 

Header 2 
-> line 3 
    line 4 
相關問題