Scan Channels and Data Types ============================ Don't mind the heavy formatting in the printing section. It's simply whitespace handling:: #!/usr/bin/env python import sys from chapter10 import C10, TYPES if __name__ == '__main__': # Get commandline args. if len(sys.argv) < 2: print('usage: stat.py ') raise SystemExit filename = sys.argv[-1] # Scan channel info channels = {} for packet in C10(filename): key = (packet.channel_id, packet.data_type) if key not in channels: channels[key] = { 'packets': 0, 'size': 0, 'type': packet.data_type, 'id': packet.channel_id} channels[key]['packets'] += 1 channels[key]['size'] += packet.packet_length # Print details for each channel. print('{} {:>13} {:>38} {:>16}'.format( 'Channel ID', 'Data Type', 'Packets', 'Size')) print('-' * 80) packets, size = 0, 0 for key, channel in sorted(channels.items()): print('Channel {:<7}'.format(channel['id']), end='') hextype = hex(channel['type'])[2:] label = TYPES[channel['type']].__name__ print('{:>2} - {:<30}'.format(hextype, label), end='') print('{:,}'.format(channel['packets']).rjust(13), end='') print('{:>16,}b'.format(channel['size'])) packets += channel['packets'] size += channel['size'] # Print file summary. print('-' * 80) print('''Summary for {}: Channels: {} Packets: {:,} Size: {:,} bytes'''.format(filename, len(channels), packets, size))