Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中偶尔返回多个值时打包和解包函数数据_Python_Function_Dictionary - Fatal编程技术网

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

在Python中偶尔返回多个值时打包和解包函数数据,python,function,dictionary,Python,Function,Dictionary,我正在读取日志,并试图处理作为file\u object发送到函数的数千个文本块(数据包)。该函数的目的是帮助创建一个字典,其中帧编号(FN)是键,不同日志数据包中的所有相关数据都被放入帧键中(帧编号可以在不同的块/数据包之间匹配)。数据包类型ID在整个日志中保持不变,只是内容在变化 因此,在函数中,到达的文本块(数据包)是多行的,因此我在函数开始时在新行上拆分。到达的数据包具有如下所示的两种不同格式,包含'='分隔符的数据包在函数中工作正常,因为每个块中只有一帧FN 我遇到的问题是第二个块,其

我正在读取日志,并试图处理作为
file\u object
发送到函数的数千个文本块(数据包)。该函数的目的是帮助创建一个字典,其中帧编号(
FN
)是键,不同日志数据包中的所有相关数据都被放入帧键中(帧编号可以在不同的块/数据包之间匹配)。数据包类型ID在整个日志中保持不变,只是内容在变化

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

我遇到的问题是第二个块,其中我在一个数据包中有多个帧和帧信息,因此我尝试从第二个文本块分割和获取每个帧数据,并将其返回到主脚本

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

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

1980Jan6 Time 03:24:05.373 001111  Packet type1
Type             = 1
FN               = 230
Active           = Yes
这是第二个包含多个帧的数据包(FN)

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

u'230': {'Type': u'1',
         'FN': u'230',
         'Active': u'Yes',
         'Flag Type': u'4a',
         'Size': u'30',
         'Is Set': u'TRUE'},
我的问题是在处理了第二个包中的其他帧号之后,因为我需要将多个属性返回到主脚本并保存到字典中

下面是从主脚本部分发送数据到函数的一个片段(
f
是脚本前面的日志集):

我在主脚本的上述部分中尝试了
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)

我认为函数正确地打包了数据,但是主脚本很难理解到达的数据。

为什么不使用两个帧解析函数,并根据第一行是否以
'type1'
'type2'
结尾,为每个帧选择合适的函数呢?Hi Jornsharpe,我想这是有意义的,我希望在一次活动中保持一切整洁。如果我在主脚本中创建了一个单独的函数,那么如果我返回最多4个帧块,每个帧块都有一个“FN”属性(return(frame1,frame2,frame3,frame4)),我将如何在主脚本中解压缩数据。。。packets[data['FN']]=data?首先,我不会将它限制为四帧,只需在行上迭代,直到用完为止。其次,解析多帧数据包的函数应该返回一个帧列表,然后您可以迭代该列表,将每个帧打包到整个字典中。
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
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)