2017-10-17 64 views
3

我正试图编写一个程序,该程序需要一个pcap文件,通过应用程序tshark过滤数据包数据,并将数据输出到字典中,将各个数据包分开。我在分离部分遇到问题。如何有效分离不同大小的数据输入?

这里基本上是我到目前为止有:

#example data input 
records = ["Jamie,20,12/09/1997,Henry,15,05/12/2002,Harriot,22,11/02/1995"] 

dict = {} 
list1 = str(records).split(',') 
i = 0 
#seperates list into sublists with length "3" 
list1 = [list1[i:i + 3] for i in range(0, len(list1), 3)] 

#places the sublists into a dictionary 
for i in range (0,len(fields)): #places the sublists into dictionary 
    dict[i] = list1[i][0].split(',') + list1[i][1].split(',') + list1[i][2].split(',') 

print(dict) 

输出看起来是这样的:

{0: ["['Jamie", '20', '12/09/1997'], 1: ['Henry', '15', '05/12/2002'], 2: ['Harriot', '22', "11/02/1995']"]} 

我明白我的代码是相当有缺陷和混乱。为了存储从每一行获取更多数据,您需要手动将每个附加字段添加到字典中,同时必须更改将列表拆分到哪里。任何帮助如何更好地自动化这个过程,考虑到不同规模的输入,将不胜感激。如果我解释我的问题不好,就问。

编辑:这里是我用来调用tshark的代码。前面代码的输入是“out”转换为字符串。上例中的姓名,年龄和出生日期代表IP源,IP目的地和协议。

filters = ["-e","ip.src"," -e ","ip.dst"," -e ","_ws.col.Protocol] #Specifies the metadeta to be extracted 

tsharkCall = ["tshark.exe", "-r", inputpcap, "-T", "fields", filters] 
tsharkProc = subprocess.Popen(tsharkCall, stdout=subprocess.PIPE) 

out, err= tsharkProc.communicate() 
+1

试试'lst = records [0] .split(',')'。不要调用你的列表'list',因为这是一个python内置的。但是目前,在分割它之前,您需要将1项目列表转换为其字符串表示形式。除此之外,我不确定你在问什么。什么是“田地”? – roganjosh

+0

你会总是有包含三行数据的字符串吗?还是仅仅是这个例子? – scnerd

+0

有没有什么办法可以为每一行获取不同的分隔符,比如'\ n'而不是'','? – scnerd

回答

1

考虑类似如下:

filters = ["ip.src","ip.dst","_ws.col.Protocol"] #Specifies the metadeta to be extracted 
ex_base = 'tshark.exe -r {path} -Tfields {fields}' 
ex = ex_base.format(path=myfile, fields=' '.join('-e ' + f for f in filters)) 
tsharkProc = subprocess.Popen(ex.split(), stdout=subprocess.PIPE, universal_newlines=True) 

out, err= tsharkProc.communicate() 

split_records = [line.split('\t') for line in out.split('\n')] 
records = [dict(zip(filters, line)) for line in split_records] 

# [{'ip.src': '127.0.0.1', 'ip.dst': '192.168.0.1', '_ws.col.Protocol': 'something'}, {...}, ...] 

这假定您保留默认输出分隔符,也就是记录和标签之间换行字段之间。通过将字段数组压缩到输出记录中,您将自动扩展字典,以便在将新字段添加到该数组中时适应新字段。

注意,你也可以使用熊猫这样完美地解决这个问题,比如:

import pandas as pd 
records = pd.Dataframe(split_records, columns=filters) 

这会给你一个数据帧结构的工作,这取决于你的应用程序,它可能是有用的。

+0

谢谢!我似乎无法让压缩部分工作,但我得到的错误“'字节'对象没有属性'读'”。 –

+1

啊,对不起,我没有用过多的子过程,并假设'沟通'返回的流。我更新了我怀疑应该解决问题的答案 – scnerd

相关问题