解析可变长度python字符串的成员

时间:2013-11-27 05:15:50

标签: python string sed

我在python中使用sed将日志文件中的文本读入单个字符串。

这是命令:

sys_output=commands.getoutput('sed -n "/SYS /,/Tot /p" %s.log' % cim_input_prefix)

这是sys_output的打印输出

SYS   SCFTYP  METHOD     NC   NO   NU  NBS  MEMORY    CPU TIME    
   1   RHF     CCSD       18   21   59   89      92      1.6163 
   2   RHF     CCSD        4    7   22   36       2      0.0036  
 Tot                                             94      1.6199 
 SYS   SCFTYP  METHOD     NC   NO   NU  NBS  MEMORY    CPU TIME
   1   RHF     CCSD        4    4   14   19       1      0.0002
 Tot                                              1      0.0002
 SYS   SCFTYP  METHOD     NC   NO   NU  NBS  MEMORY    CPU TIME
   1   RHF     CCSD        4    9   36   55       8      0.0416
   2   RHF     CCSD       18   25   73  108     200      5.3587
   3   RHF     CCSD        4   10   29   48       6      0.0217
 Tot                                            214      5.4221

其中有三组,感兴趣的是[2,1,3]行。

我的脚本会遇到的日志文件可能有不同数量的组和行,因此我不能简单地拆分字符串并提取有用的信息。

我对组和行的索引以及内存列感兴趣。

如何解析这个大字符串以获取字典,例如:

{'1-1': 92, '1-2': 2, '2-1': 1, '3-1': 8, '3-2': 200, '3-3': 6}?

非常感谢你的时间

1 个答案:

答案 0 :(得分:1)

某种基于输出特定特征的状态机可能比让对指数过度担忧更容易。

此代码段与示例一起使用,可以进行定制以处理极端情况。

import collections

with open("cpu_text", "r") as f:
    lines = f.readlines()

lines = [line.strip() for line in lines]

group_id = 0
group_member_id = 0
output_dict = collections.OrderedDict()

for line in lines:
    if line.find("SYS") > -1:
        group_id += 1
    elif line.find("Tot") > -1:
        group_member_id = 0
    else:
        group_member_id += 1
        key = "{0}-{1}".format(group_id, group_member_id)
        memory = line.split()[7]
        output_dict[key] = memory

print(output_dict)

<强>输出:

OrderedDict([('1-1', '92'), ('1-2', '2'), ('2-1', '1'), ('3-1', '8'), ('3-2', '200'), ('3-3', '6')])