2015-05-12 149 views
0

我拥有一个文件,我想读取它的特定部分。这是文件。如何从特定行读取python中的特定行

..... ..... 管理服务器界面开始 ... .... .... .... .... 管理服务器接口结束 ... ....

我想读'管理服务器接口开始'到'管理服务器接口结束'之间的文件部分。我在perl中找到了一种方法,但是在python中找不到方法。

在Perl

while (<INP>) 
{ 
    print $_ if(/^AdminServer interface definitions begins/ .. /^AdminServer interface definitions ends/); 
} 

可能anyonle请帮助。

回答

3

您可以逐行阅读文件并收集标记之间的内容。

def dispatch(inputfile): 
    # if the separator lines must be included, set to True 
    need_separator = True 
    new = False 
    rec = [] 
    with open(inputfile) as f: 
     for line in f: 
      if "Admin server interface begins" in line: 
       new = True 
       if need_separator: 
        rec = [line] 
       else: 
        rec = [] 
      elif "Admin server interface ends" in line: 
       if need_separator: 
        rec.append(line) 
       new = False 
       # if you do not need to process further, uncomment the following line 
       #return ''.join(rec) 
      elif new: 
       rec.append(line) 
    return ''.join(rec) 

上面的代码将成功返回数据,即使输入文件不包含结束分隔符(Admin server interface ends)。您可以使用条件修改的最后return,如果你想赶上这样的文件:

if new: 
    # handle the case where there is no end separator 
    print("Error in input file: no ending separator") 
    return '' 
else: 
    return ''.join(rec) 
+0

您可能希望'elif'部分的'Admin server interface ends'。 – Santiago

+0

@ user3267581:是的,我打字太快,谢谢。纠正。 – WoJ

+0

你也应该跳出'elif'管理服务器接口中的循环:'block',因为OP不需要文件 – oxymor0n

1

如果文件不是很大,你不关心内存消耗,你可以写这个简单的解决方案:

from os.path import isfile 
def collect_admin_server_interface_info(filename): 
    """ Collects admin server interface information from specified file. """ 
    if isfile(filename): 
     contents = '' 
     with open(filename, 'r') as f: 
      contents = file.read() 
     beg_str = 'Admin server interface begins' 
     end_str = 'Admin server interface ends' 
     beg_index = contents.find(beg_str + len(beg_str)) 
     end_index = contents.find(end_str) 
     if beg_index == -1 or end_index == -1: 
      raise("Admin server interface not found.") 
     return contents[beg_index : end_index] 
    else: 
     raise("File doesn't exist.") 

此方法将尝试返回包含管理员服务器接口信息的单个字符串。