Count the number of packets with pyshark

11k views Asked by At

In this code with pyshark

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

i and len(cap._packets) give two different results. Why is that?

4

There are 4 answers

1
Leistungsabfall On BEST ANSWER

A look at the source code reveals that _packets is a list containing packets and is only used internally:

When iterating through a FileCapture object with keep_packets = True packets are getting added to this list.


To get access to all packets in a FileCapture object you should iterate over it just like you did:

for packet in cap:
    do_something(packet)

But to count the amount of packets just do this:

packet_amount = len(cap)

or use a counter like you did, but don't use _packets as it does not contain the complete packet list.

0
Prateek Kumar Singh On

Just adding another way using callback function. Also little bit faster approach.

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

cap.apply_on_packets(count_callback)

print(length)
0
langiac On

i too, len(cap) is 0, i thinks the answer is fail. if you want know len(cap), please load packet before print it. use: cap.load_packets()

cap.load_packets()
packet_amount = len(cap)
print packet_amount
2
Derorrist On

Don't know if it works in Python 2.7, but in Python 3.4 len(cap) returns 0. The FileCapture object is a generator, so what worked for me is len([packet for packet in cap])