在Python中查找并提取所需的信息

时间:2011-08-29 11:53:07

标签: python

我从HP设备获取信息并将其存储在名为data的变量中。

现在,我想从输出中仅提取Chassis:Serial Number:的值,其示例如下(我通过键入命令show module获得它):< / p>

============================
coaza077-cor-01> show module

 Status and Counters - Module Information
  Chassis: 2900-24G J9049A         Serial Number:   SG748KI09F
  Slot  Module Description                       Serial Number
  ----- ---------------------------------------- --------------

coaza077-cor-01> exit
Do you want to log out [y/n]? y
=============================

以下代码是我尝试这样做的:

    sList = os.linesep.join([s for s in data.splitlines() if s])


for i in range(0,len(sList)):

    if (sList[i].lower()).find('Chassis') >= 0:
        #DEVICE PROCESSOR
        device_processor= _parse.getdata(sList[i].lower(), 'Chassis:', ' ')
        if debugging == "_HP2900" or debugging == "ALL": print "_HP2900.py", "Processor", device_processor          

    if (sList[i].lower()).find('Serial Number') >= 0:
        print 'Serial Number'
        #DEVICE SERIAL NUMBER
        device_serial= (_parse.serial_number(sList[i].lower()[len('Serial Number'):])).upper()
        if debugging == "_HP2900" or debugging == "ALL": print "_HP2900.py", "Serial", device_serial

..但是我似乎无法获得我需要的两个值。我是Python的新手,并且不确定我是否正确地解决了这个问题。

如何才能获得我需要的字段?

3 个答案:

答案 0 :(得分:7)

>>> data = """
============================
coaza077-cor-01> show module

 Status and Counters - Module Information
  Chassis: 2900-24G J9049A         Serial Number:   SG748KI09F
  Slot  Module Description                       Serial Number
  ----- ---------------------------------------- --------------

coaza077-cor-01> exit
Do you want to log out [y/n]? y
=============================
"""
>>> chasis = data.split('Chassis:')[1].split('Serial')[0].strip()
>>> serial = data.split('Serial Number:')[1].split()[0].strip()
>>> 
>>> print chasis
2900-24G J9049A
>>> print serial
SG748KI09F

评论更新:

>>> x, y = chasis.split()
>>> print x
2900-24G
>>> print y
J9049A

答案 1 :(得分:1)

前几件事。

为什么首先将数据拆分成行然后将它们连接成字符串?你的迭代遍历每个符号,而不是每个字母。

什么是_parse?如果您需要帮助,请粘贴所有需要的代码。

sList[i].lower()).find('Chassis')你想如何在全部降低的文本中找到“Chasis”这个词?请记住,该发现并非独立于案例。

更多pythonic:

for line in data.splitlines():
    if "Chassis" in line:
        print line
        #DEVICE PROCESSOR
        #device_processor= _parse.getdata(sList[i].lower(), 'Chassis:', ' ')
        #if debugging == "_HP2900" or debugging == "ALL": print "_HP2900.py", "Processor", device_processor          

    if 'Serial Number' in line:
        print line
        #DEVICE SERIAL NUMBER
        #device_serial= (_parse.serial_number(sList[i].lower()[len('Serial Number'):])).upper()
        #if debugging == "_HP2900" or debugging == "ALL": print "_HP2900.py", "Serial", device_serial  

数据就是你的所有文字。尝试阅读更多关于pythonic方法的内容,让您的生活更轻松;)

脚本现在所做的是找到正确的行。当你写_parse时,我可以在这个答案中添加更多内容。

答案 2 :(得分:1)

由于您首先将当前行更新为小写,然后尝试查找混合大写/小写的字符串,因此无效。所以你需要的就是删除.lower()。

试试这个:

for row in (line.strip() for line in data.split('\n') if line.strip()):

    rData = row.split() # just for sample

    if 'Chassis' in row:
        #DEVICE PROCESSOR
        chassisInd = rData.index('Chassis:')
        if chassisInd + 1 < len(rData):
            print 'Chassis:', rData[chassisInd + 1]

    if 'Serial Number' in row:
        serialInd = rData.index('Serial Number:')
        if serialInd + 1 < len(rData):
            print 'Serial Number:', rData[serialInd + 1]