在Python中搜索某个元素和元素内的字符串列表

时间:2017-01-23 19:43:31

标签: python string list

我使用var minute = Number(document.getElementById('autoDropDown').value); 将54,000行日志导入Python。我需要从日志中提取可变数量的行来捕获服务器make和固件版本。例如,以下是日志中的3行:

readlines()

# racadm getversion <Server> <iDRAC Version> <Blade Type> <Gen> <Updatable> server-1 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y server-2 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y 仅在日志中出现一次。可列出1台服务器到32台服务器。我需要解析此日志以捕获iDRAC版本和服务器版本,然后将其保存到我的刀片类(racadm getversionself.iDRAC)的类属性中。还有其他我需要捕捉的东西,但我应该能够应用同样的概念。

我怎么能添加一行来说明(以下不是我的实际代码,只是一个粗略的例子):

self.model

3 个答案:

答案 0 :(得分:0)

您的问题有点不清楚,但这是否在正确的位置?

简而言之,我不知道您是使用制表符还是四个连续空格来分隔字段,因此我使用正则表达式(\s{4}|\t)处理这两种情况。如果需要,您可以更改此内容。

import re

DATA = \
"""<Server>    <iDRAC Version>        <Blade Type>     <Gen>   <Updatable>
server-1    1.57.57 (Build 04)     PowerEdge M620   iDRAC7       Y
server-2    1.57.57 (Build 04)     PowerEdge M620   iDRAC7       Y"""


class Blade(object):
    def __init__(self, model, idrac):
        self.model = model
        self.idrac = idrac

    def __repr__(self):
        return 'Blade (model={}, idrac={})'.format(self.model, self.idrac)


def parse_data(data):
    for line in data.splitlines()[1:]:
        model, idrac = re.split(r'(\s{4}|\t)', line)[:2]
        yield Blade(model, idrac)


if __name__ == '__main__':
    for blade in parse_data(DATA):
        print(blade)

<强>输出

Blade (model=server-1, idrac=1.57.57 (Build 04))
Blade (model=server-2, idrac=1.57.57 (Build 04))

答案 1 :(得分:0)

一旦你有这样的一行

server-1    1.57.57 (Build 04)     PowerEdge M620   iDRAC7       Y

您可以使用split()将每个部分分隔到数组中。默认情况下,split()会将字符串与任何空格分开。但看起来你的字符串中有一些字段中有空格。你可以将它分割成一个标签(如果这就是字符串的分隔方式),就像这样:

for line in cmclist:
    separated=line.split("\t")
    version=separated[1]

这里line.split("\t")应该给你:

["server-1", "1.57.57 (Build 04)", "PowerEdge M620", "iDRAC7", "Y"]

您可以详细了解split() here

答案 2 :(得分:0)

您对next电话有正确的想法。为列表创建一个迭代器,然后使用fornextitertools中的帮助程序来运行它。迭代器记住它们的位置,所以如果你提前退出循环,它们只需重新启动下一个项目。以下是itertools的几个示例。第二个使用yield from这是一个python 3的东西。

import itertools

cmclog = """other stuff
other stuff
# racadm getversion
<Server>    <iDRAC Version>        <Blade Type>     <Gen>   <Updatable> 
server-1    1.57.57 (Build 04)     PowerEdge M620   iDRAC7       Y
server-2    1.57.57 (Build 04)     PowerEdge M620   iDRAC7       Y
other stuff
other stuff""".split("\n")

def scan_server_list(cmclog):
    server_list = []
    icmc = iter(cmclog)
    try:
        # drop everything through the racadm sentinal
        next(itertools.dropwhile(
            lambda line: not line.startswith("# racadm getversion"),
            icmc))
        # skip header
        next(icmc)
        # take all servers
        server_list.extend(itertools.takewhile(
            lambda line: line.startswith("server-"),
            icmc))
    except StopIteration:
        pass
    return server_list

print(scan_server_list(cmclog))

def scan_server_list_2(cmclog):
    icmc = iter(cmclog)
    # drop everything through the racadm sentinal
    next(itertools.dropwhile(
        lambda line: not line.startswith("# racadm getversion"),
        icmc))
    # skip header
    next(icmc)
    # take all servers
    yield from itertools.takewhile(
        lambda line: line.startswith("server-"),
        icmc)

print(list(scan_server_list_2(cmclog)))