Python用Scapy读取Pcap写入CSV仅得单条数据的技术求助
解决Scapy写入CSV仅存一条数据的问题
我来帮你揪出问题根源!你现在CSV里只有一条数据,核心原因有两个:
- 每次循环都用
open("Pcap/test.csv", "w")打开文件——"w"是覆盖写入模式,每次打开都会清空文件原有内容,最后自然只剩最后一次循环的数据。 - 你在每次循环里都重新构造并写入表头,这不仅重复冗余,还会把之前的数据覆盖掉。
下面给你两种修复方案,从简单到专业:
方案1:基础文件操作修复
先一次性写入表头,之后用追加模式("a")写入每条符合条件的数据:
from scapy.all import rdpcap, IP, TCP pkts = rdpcap('example.pcap') # 第一步:写入CSV表头(只执行一次) with open("Pcap/test.csv", "w") as f: # 注意修正了你之前的拼写错误:IP_drc → IP_dst f.write("IP_src,IP_dst,dst_port\n") # 第二步:循环处理数据包,追加写入数据 for pkt in pkts: if IP in pkt: ip_src = pkt[IP].src ip_dst = pkt[IP].dst # 把条件合并,让代码更简洁 if TCP in pkt and ip_src == '10.116.206.114' and ip_dst == '10.236.138.184': tcp_dport = pkt[TCP].dport print(f"{ip_src}{ip_dst}{tcp_dport}") # 构造一行数据 data_line = f"{ip_src},{ip_dst},{tcp_dport}\n" # 用追加模式打开文件,写入新行 with open("Pcap/test.csv", "a") as f: f.write(data_line)
方案2:用Python CSV模块更可靠(推荐)
手动拼接字符串容易出问题(比如字段包含特殊字符时),用Python内置的csv模块更规范、更安全:
from scapy.all import rdpcap, IP, TCP import csv pkts = rdpcap('example.pcap') # 打开文件并初始化CSV写入器 with open("Pcap/test.csv", "w", newline='') as csv_file: # 定义表头字段 field_names = ['IP_src', 'IP_dst', 'dst_port'] writer = csv.DictWriter(csv_file, fieldnames=field_names) # 写入表头 writer.writeheader() # 循环处理数据包 for pkt in pkts: if IP in pkt: ip_src = pkt[IP].src ip_dst = pkt[IP].dst if TCP in pkt and ip_src == '10.116.206.114' and ip_dst == '10.236.138.184': tcp_dport = pkt[TCP].dport print(f"{ip_src}{ip_dst}{tcp_dport}") # 写入一行数据,字典键对应表头 writer.writerow({ 'IP_src': ip_src, 'IP_dst': ip_dst, 'dst_port': tcp_dport })
关键说明:
with语句会自动帮你关闭文件,避免手动关闭的遗漏问题。- 追加模式
"a"只会把新内容加到文件末尾,不会覆盖原有数据。 csv模块会自动处理字段分隔、转义等细节,适合复杂场景。
内容的提问来源于stack exchange,提问作者Darshan Mahalinge Gowda
相关产品推荐
相关产品推荐

