0%

批量将Pcap文件转为CSV文件,带表头数据

给女朋友写的工具,具体思路见代码注释,不另作赘述。

文件链接: pacp2csv.py (原创代码仅用于学习)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import csv
from scapy.all import *
import os

count = 0 # 计数器
printloop = 200 # 输出间隔
path = 'dataset' # 数据所在目录
timesamp = time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime()) # 时间戳
savefilename = 'dataset_' + timesamp + '.csv' # 保存文件名,加上时间戳

filenames = os.listdir(path) # 获取所有数据文件名

print('发现 %d 个Pcap数据文件:' % (len(filenames)))
for filename in filenames:
print('\t', filename)
print('\n开始转换,转换后数据将存入文件: %s\n' % (savefilename,))

with open(savefilename, 'a', newline='') as f:
fcsv = None # 公用csv writer对象,存入第一条数据前初始化
for filename in filenames:
pkts = rdpcap(os.path.join(path, filename))
for pkt in pkts:
if 'IP' in pkt and 'Ethernet' in pkt and 'TCP' in pkt:
# 调试发现Ethernet、IP、TCP对象都有fields属性,可以直接获取数据字典
e = pkt['Ethernet'].fields
i = pkt['IP'].fields
t = pkt['TCP'].fields

# 去除IP及TCP中不需要的optons字段,并将重名字段添加前缀
i.pop('options', '') # 必须加上第二个参数(默认值),否则options不存在时会报错
i['ip_flags'] = i.pop('flags') # pop会将值删除,然后重新设置新的key-value
i['ip_src'] = i.pop('src')
i['ip_dst'] = i.pop('dst')
i['ip_chksum'] = i.pop('chksum')

t.pop('options', '')
t['tcp_flags'] = t.pop('flags')
t['tcp_chksum'] = t.pop('chksum')

# 创建新的数据字典
data = {}
data.update(e) # 将k-v数据更新进data
data.update(i)
data.update(t)

if fcsv is None:
# 初次运行时,fcsv是None,进行初始化表头,及csv writer
fieldnames = data.keys() # 以数据字典的key做表头
fcsv = csv.DictWriter(f, fieldnames=fieldnames) #
fcsv.writeheader()

# 写入字典数据到文件,会自动按照fieldnames进行排列
fcsv.writerow(data)
count += 1

if count % printloop == 0:
print('已转换 %d 条, 当前数据文件名: %s' % (count, filename))

f.close()

print('\n转换完成,共 %d 条, 存入文件名: %s' % (count, savefilename))