2013-03-04 93 views
1

在本示例中,我在文件中找到一个字符串并将匹配行写入另一个文件。这是基本的,我现在可以做的。从文件中写入行

fd_w = open('tt', 'w') 
with open('r.0', 'r') as IRR: 
    for line in IRR: 
     if 'status: ASSIGNED PA' in line: 
      towrite = "%s" % (line) 
fd_w.write(towrite) 
fd_w.close() 

我真正想要做的是,当有一个匹配的行,让之前的匹配线的线,直到有一个空间,同样得到了匹配行之后的行,直到有一个空格。

这是正在读取的文件中的示例。

admin-c:  DUMY-RIPE 
tech-c:   DUMY-RIPE 
status:   ASSIGNED PA 
mnt-by:   AS6667-MNT 

admin-c:  DUMY-RIPE 
tech-c:   DUMY-RIPE 
status:   ASSIGNED PA 
mnt-by:   DATANET-NOC 

我一直在尝试理清如何定义两个函数,比如在匹配行后获取上一行和下一行。所以任何想法,任何帮助都被高度占用。

+0

请修正代码缩进。 – poke 2013-03-04 12:39:37

+0

要清楚,如果状态为“ASSIGNED PA”,并且将其写入文件,您希望读取其中一个块中的所有内容。否则丢弃整个块? – msvalkon 2013-03-04 12:45:30

+0

这是对的;如果有与ASSIGNED PA匹配的块保留它,否则只需放弃该块。 – 2013-03-04 12:51:44

回答

2

读取数据,用空行和测试你的状态后划定块:

with open('r.0', 'r') as IRR, open('tt', 'w') as fd_w: 
    lines = [] 
    for line in IRR: 
     line = line.strip() 
     if line: 
      lines.append(line) 
     else: 
      # empty line, found a complete block, test for status line 
      if 'status:   ASSIGNED PA' in lines: 
       for line in lines: 
        fd_w.write(line + '\n') 
      lines = [] 
+0

而不是line.strip(),然后写入line +'\ n',您可以删除line.strip()并只写行。将在所有平台上工作。 strip也会删除'\ r \ n'。 – shantanoo 2013-03-04 16:31:36

+0

@shantanoo:文件以文本模式打开,本地换行约定会自动执行。我剥去了这些线以便更容易地测试匹配线。 – 2013-03-04 16:34:48

+0

谢谢@ martijn-pieters。没有意识到当地换行公约被尊重。国际海事组织,最好不要改变新的公约。程序输出不应该依赖于它正在运行的操作系统。 – shantanoo 2013-03-04 20:45:14

0

我会创建一个缓冲区并保留一个变量来判断该缓冲区是否存在匹配。

例如,当您开始读取文件时,使用列表启动缓冲区。

将所有内容附加到该列表中,直到获得另一个空间,如果在此期间找到匹配项,则使用变量来跟踪该事实。

当你最终到达另一个空间时,如果该变量为true,则使用该缓冲区来执行任何你想要的操作,即写入另一个文件。

重置缓冲区,重新开始。

直到文件结束。