【问题标题】:Convert all pcap file to csv with required columns python将所有 pcap 文件转换为带有所需列 python 的 csv
【发布时间】:2019-11-24 03:10:21
【问题描述】:

我需要将所有输出 CSV 文件写入不同的文件夹。例如,如果 .pcap 文件位于子文件夹 Sub1Sub2 中。而Sub1a1.pcapa2.pcap。 Sub2 有b1.pcapb2.pcap

我需要将输出的 CSV 文件写入与上述名称相同的文件夹中。 Sub1Sub2,然后Sub1 应该有a1.csva2.csvSub2 应该有 b1.csvb2.csv

请问我该怎么做?

我收到以下错误:

outputdir = startdir / "Outcsv"
TypeError: unsupported operand type(s) for /: 'str' and 'str'

代码是:

import os
startdir= '/root/Desktop/TTT'
suffix= '.pcap'
outputdir = startdir / "Outcsv"

for root,dirs, files, in os.walk(startdir):
    for name in files:
        if name.endswith(suffix):
            filename = os.path.join(root,name)
            output_filename = outputdir / filename.relative_to(startdir)
            cmd = 'tshark -r {} -T fields -e frame.number -e frame.time_relative -e wlan.sa -e wlan.da -e wlan.ta -e wlan.ra -e frame.time_delta_displayed -e frame.len -E header=y -E separator=, -E quote=d -E occurrence=f > {}.csv'
            final_cmd = cmd.format(filename, output_filename)
            os.system(final_cmd)

【问题讨论】:

    标签: python python-3.x csv wireshark pcap


    【解决方案1】:

    如果您尝试在其他位置重新创建文件夹结构,则需要确保已创建文件夹。这可以使用os.makedirs() 命令来完成。可以使用比startdir 更深的任何路径来确定子文件夹结构。然后可以将其附加到您的 outputdir 位置。

    也可以使用os.path.splitext()替换文件扩展名。

    例如:

    import os
    
    startdir = '/root/Desktop/TTT'
    suffix= '.pcap'
    outputdir = os.path.join(startdir, "Outcsv")
    
    for root, dirs, files, in os.walk(startdir):
        for name in files:
            if name.lower().endswith(suffix):
                sub_folders = root[len(startdir)+1:]
    
                input_filename = os.path.join(root, name)
                output_path = os.path.join(outputdir, sub_folders)
                os.makedirs(output_path, exist_ok=True)  # Ensure the output folder exists
                output_filename = os.path.join(output_path, os.path.splitext(name)[0] + '.csv')
    
                cmd = 'tshark -r {} -T fields -e frame.number -e frame.time_relative -e wlan.sa -e wlan.da -e wlan.ta -e wlan.ra -e frame.time_delta_displayed -e frame.len -E header=y -E separator=, -E quote=d -E occurrence=f > {}'
                final_cmd = cmd.format(input_filename, output_filename)
    
                print(final_cmd)
                os.system(final_cmd)
    

    【讨论】:

    • Martin 能否帮助解决这个问题,请stackoverflow.com/questions/57182426/… 我试图更改代码,查看您的代码,但没有运气。需要在不同的位置重新创建文件夹结构。非常感谢
    【解决方案2】:

    致电tshark,(类似这样的)

    f_in = 'x.pcap'
    f_out = 'x.csv'
    tshark_template = 'tshark -r {} -T fields -e frame.number -e frame.time -e eth.src -e eth.dst -e ip.src -e ip.dst -e ip.proto -E header=y -E separator=, -E quote=d -E occurrence=f > {}'
    final_tshark_cmd = tshark_template.format(f_in,f_out)
    

    使用 python 动态构建命令,因此您可以控制文件的名称。

    每个-e 代表您希望在输出中出现的字段。

    【讨论】:

    • 谢谢。如何获得与输入 pcap 文件相同的名称,输出 csv 文件需要以与原始 pcap 文件相同的方式保存,具有相同的文件夹名称和子文件夹名称。对不起,我是编程新手。我不知道如何将所有这些放入 python 脚本中。
    • 代码运行良好。但我需要将所有输出 csv 文件写入不同的文件夹。例如,如果 .pcap 文件位于子文件夹 Sub1、Sub2 中。 Sub1 有 a1.pcap 和 a2.pcap。 Sub2 有 b1.pcap 和 b2.pcap。我需要将输出的 csv 文件写入与上述名称相同的文件夹中。子 1,子 2。那么 Sub1 应该有 a1.csv、a2.csv。 Sub2 应该有 b1.csv、b2.csv。请问我该怎么做?
    • @user3535695 修改f_out 并使其包含文件夹名称。
    • 能否请您在问题中查看我更新的代码。我需要转换很多 pcap 文件。所以如果我使用 f_in = '' 那么我只能给出一个名字吗?
    • @user3535695 看来您的方向是正确的。您需要做的就是更改cmd.format(filename,filename) 中的第二个文件名并将startdir 替换为outdir,并将csv 后缀添加到文件名中。有意义吗?
    猜你喜欢
    • 2016-12-17
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2020-11-11
    相关资源
    最近更新 更多