在Python中偶尔返回多个值时打包和解包函数数据

时间:2015-03-13 11:00:06

标签: python function dictionary

我正在阅读日志并尝试处理以file_object形式发送到该函数的数千个文本块(数据包)。该函数的目的是帮助创建一个字典,其中帧号(FN)是关键字,不同日志包中的所有相关数据都被丢弃到帧密钥中(帧号可以匹配不同的块/包) 。数据包类型ID在整个日志中保持不变,只是内容正在发生变化。

因此在函数中,到达的文本块(数据包)是多行的,所以我在函数的开头拆分了一个新行。到达的数据包有两种不同的格式,包含'='分隔符的数据包在函数中正常工作,因为每个块中只有一个帧FN

我遇到的问题是第二个块,我在一个数据包中有几个帧和帧信息,所以我试图从第二个文本块中拆分并获取每个帧数据并将其返回到主脚本。 / p>

回到主脚本后,将对帧编号进行匹配,并将函数中的数据放入字典中。如上所述,当有一个帧编号时,这很好,但是多个帧编号返回到主脚本中,密钥匹配有问题。

这是第一个数据包,这个工作正常,因为只有一个帧号...

1980Jan6 Time 03:24:05.373 001111  Packet type1
Type             = 1
FN               = 230
Active           = Yes

这是第二个包含多个帧(FN)

的数据包
1980Jan6 Time 03:24:05.373 001222  Packet type2
| FN  | Flag type | Size | Is Set |
| 230 | 4a        |  30  | TRUE   |    
| 231 | 64        |  20  | TRUE   |    
| 232 | Test      |  28  | FALSE  |    
| 233 | Not set   |   8  | FALSE  |   

我正在为每个帧编号创建一个字典并删除相关的匹配帧编号属性。

u'230': {'Type': u'1',
         'FN': u'230',
         'Active': u'Yes',
         'Flag Type': u'4a',
         'Size': u'30',
         'Is Set': u'TRUE'},

我的问题是在处理第二个数据包中的其他帧数后,因为我需要将多个属性返回到主脚本并保存到字典

这里是主脚本部分将数据发送到函数的片段(f是脚本中早期设置的日志):

packets = {}
parser.open_log(f)

mypkt = parser.app.packet

while (mypkt.next()):
    data = process_data_direct(mypkt.text) # Here we go off to the function with the packet
    packets[data['FN']] = data # here we process the returning function data

我在主脚本的上一部分中尝试了for item in data:,但无济于事。

这里的功能是:

def process_data_direct(file_object):
    split_data = file_object.split('\n')

    frame1 = {}
    frame2 = {}
    frame3 = {}
    frame4 = {}
    framelist = [frame1,frame2,frame3,frame4]
    frame_no = 0    

    for line in split_data:
    if '=' in line:
        key, value = line.split('=', 1)
        frame1[key.strip()] = value.strip()

    elif re.search(r'\|\s+\d+\|', line):
        frame_no += 1
        metric = [x.strip() for x in line.split('|')] 
        if int(metric[1]) > 0:
            framelist[frame_no]['FN'] = metric[1]
            framelist[frame_no]['Flag Type'] = metric[2]
            framelist[frame_no]['Size'] = metric[3]
            framelist[frame_no]['Is Set'] = metric[4]

    return (frame1,frame2,frame3,frame4)

我认为该函数正确地打包数据,但主脚本正在努力理解到达的数据。

0 个答案:

没有答案