4

在这段代码中使用 pyshark

import pyshark
cap = pyshark.FileCapture(filename)
i = 0
for idx, packet in enumerate(cap):
    i += 1
print i
print len(cap._packets)

ilen(cap._packets)给出两个不同的结果。这是为什么?

4

4 回答 4

11

不知道它是否适用于 Python 2.7,但在 Python 3.4 中len(cap)返回 0。 FileCapture 对象是一个生成器,所以对我有用的是len([packet for packet in cap])

于 2016-05-23T08:47:03.550 回答
7

我也是,len(cap) 为 0,我认为答案是失败。如果您想知道 len(cap),请在打印前加载数据包。使用:cap.load_packets()

cap.load_packets()
packet_amount = len(cap)
print packet_amount
于 2018-07-09T15:15:40.827 回答
0

查看源代码会发现这_packets是一个包含数据包的列表,并且仅在内部使用:

当使用数据包迭代FileCapture对象时,keep_packets = True将被添加到此列表中。


要访问FileCapture对象中的所有数据包,您应该像以前一样对其进行迭代:

for packet in cap:
    do_something(packet)

但是要计算数据包的数量,只需这样做:

packet_amount = len(cap)

或像您一样使用计数器,但不要使用 _packets,因为它不包含完整的数据包列表。

于 2014-11-19T20:40:16.640 回答
0

只是使用回调函数添加另一种方式。也有点快的方法。

length = 0 
def count_callback(pkt):
    global length
    length = length + 1

cap.apply_on_packets(count_callback)

print(length)
于 2021-10-06T13:47:30.850 回答