如何从特定的阵列读取到Python中的特定行

  • 本文关键字:Python 读取 阵列 python parsing
  • 更新时间 :
  • 英文 :


我有一个文件,我想阅读其中的特定部分。这是文件。

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

我想读取"管理服务器接口"之间的文件部分,直到" admin Server接口结束"。我找到了一种在Perl中进行的方法,但找不到Python的方法。

在perl

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

可以提供帮助。

您可以通过行读取文件并收集标记之间的内容。

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)

如果文件不太大,并且您不关心内存消耗,则可以编写此简单解决方案:

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.")

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

最新更新