代码之家  ›  专栏  ›  技术社区  ›  E. Simmonds

如何有效地分离不同大小的数据输入?

  •  3
  • E. Simmonds  · 技术社区  · 7 年前

    我试图编写一个程序,接收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的代码。前一个代码的输入被“输出”转换为字符串。上例中的姓名、年龄和出生日期表示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 回复  |  直到 7 年前
        1
  •  1
  •   scnerd    7 年前

    考虑以下情况:

    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)
    

    这将为您提供一个数据帧结构,根据您的应用程序,它可能会很有用。