我有一个很大的 pcap 文件,我正在使用下面的 python 代码对其进行解析。该代码可以工作,但有一个问题。当我解析 pcap 文件时,如下面的代码所示,我将值存储在另一个名为 filename 的文件中
pkts=rdpcap("MyFile.pcap")
def parsePcap():
IPList = []
for pkt in pkts:
if IP in pkt:
ip_src=pkt[IP].src
ip_dst=pkt[IP].dst
ip_proto=pkt[IP].proto
IPList.append((ip_src,ip_dst,ip_proto))
return IPList
#parseOutput = parsePcap()
f = open('filename', 'w')
f.write(' '.join(map(str, parsePcap())))
f.close()
当我从“文件名”检索值时,问题就出现了。我得到以下输出(下面的确切示例)。但事实并非如此。
('121.14.142.72',
'0.32.59.21',
6,
)
('123.152.135.217',
'0.3.17.121',
17,
)
('71.229.65.158',
'0.48.101.12',
17,
)
当我运行以下代码时 -
uniqueNodePairs=[]
myArr = map(str, open("filename").readline().strip().split())
for i in myArr:
print i
uniqueNodePairs.append((i[0],i[1]))# pairs of src., dst
for i in uniqueNodePairs:
print i
我得到以下信息 -
('(', "'")
("'", '0')
('6', ')')
('(', "'")
("'", '0')
('1', '7')
('(', "'")
("'", '0')
这意味着值不会存储为字符串,而是单个字符。这不是我想要的。我想要这样的输出
('121.14.142.72','0.32.59.21'),
('123.152.135.217','0.3.17.121'),...
最佳答案
还有一件事要考虑。您的输入文件是 5Gb,因此您可能不应该从 parsePcap() 函数返回列表。由于您对该列表所做的一切都是对其进行迭代,因此最好使用 yield
关键字将您的函数转换为生成器。这是您的原始函数:
def parsePcap():
IPList = []
for pkt in pkts:
if IP in pkt:
ip_src=pkt[IP].src
ip_dst=pkt[IP].dst
ip_proto=pkt[IP].proto
IPList.append((ip_src,ip_dst,ip_proto))
return IPList
这是生成器的样子:
def parsePcap():
for pkt in pkts:
if IP in pkt:
ip_src=pkt[IP].src
ip_dst=pkt[IP].dst
ip_proto=pkt[IP].proto
yield (ip_src,ip_dst,ip_proto)
这样,您就不会将整个列表存储在内存中:当每个 src、dst、proto 三元组准备就绪时,它会从函数返回,写入输出文件,然后从内存中处理。
通过使用生成器而不是构建列表并返回它,您将允许自己处理更大的文件。 5Gb 小于大多数现代系统上的 RAM 量,因此输入文件并不是真正的问题 - 但如果您有一个 500Gb 的文件要处理,您会发现生成器版本比构建列表快得多-and-return-it 版本,它将不断地访问交换文件。
关于python - 在 python 中解析大 (.5Gb) pcap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32535267/