2013-02-08 44 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