在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)