[Tutor] Compute data usage from log

bibi midi bibsmendez at gmail.com
Tue Oct 27 12:33:14 CET 2009

#!/usr/bin/env python
# -*- coding: utf-8 -*-

Calculate internet data consumption
of service provider
Code as per help of python tutor mailing list
Created: 26-Oct-2009

intro = raw_input('press enter to view your internet data consumption: ')
log_file = '/home/bboymen/mobily.data.plan'
total_consumed = 0
for line in open(log_file):
    total_consumed += int(line.split(' ')[9])

total_consumed = total_consumed/1000000.0
print "total data consumed is: %0.3f MB\n" % total_consumed

#1) show the list comprehension alternative method
#2) add exception handling e.g. when log_file cant be found or when
key interrupt is pressed
#      or when index[9] is not a number, etc
#3) print latest date of calculated data

I'm working on TODO no. 3 e.g. I want to show the latest date when wvdial
generated the ppp data. This is normally the date of last line of the ppd:

Oct 14 11:03:45 cc000002695 pppd[3092]: Sent 3489538 bytes, received
43317854 bytes.

For the exception handling i *think* i just use the general exception method
e.g. will catch all kinds of error. I really dont know what other errors
will show up aside from the ones i listed in the TODO. Advise is

On Mon, Oct 26, 2009 at 2:12 PM, Luke Paireepinart
<rabidpoobear at gmail.com>wrote:

> On Mon, Oct 26, 2009 at 3:20 AM, Christian Witts <cwitts at compuscan.co.za>wrote:
>> fInput = open('/path/to/log.file', 'rb')
>> total_usage = 0
>> for line in fInput:
>>   total_usage += int(line.split(' ')[9].strip())
>> print total_usage
> It's actually bad to assign a variable to the file object in this case
> (flinput = ....) because Python will automatically close a file after you're
> done with it if you iterate over it directly, but if you include a reference
> it will stay open until the python program ends or you explicitly call
> flinput.close().  It doesn't matter much in this example but in general it
> is good practice to either
> 1) call foo.close() immediately after you're done using a file object, or
> 2) don't alias the file object and just over it directly so Python will
> auto-close it.
> Therefore a better (and simpler) way to do the above would be:
> total_usage = 0
> for line in open('/path/to/log.file'):
>     total_usage += int(line.split(' ')[9])
> Also note you don't need to strip the input because int() coersion ignores
> whitespace anyway. And additionally you shouldn't be opening this in binary
> mode unless you're sure you want to, and I'm guessing the log file is ascii
> so there's no need for the 'rb'.  (reading is default so we don't specify an
> 'r'.)
> And since I like list comprehensions a lot, I'd probably do it like this
> instead:
> total_usage = sum([int(line.split(' ')[9]) for line in
> open('/path/to/log.file')])
> Which incidentally is even shorter, but may be less readable if you don't
> use list comprehensions often.
> Also, the list comprehension version is likely to be more efficient, both
> because of the use of sum rather than repeated addition (sum is implemented
> in C) and because list comprehensions in general are a tad faster than
> explicit iteration, if i recall correctly (don't hold me to that though, I
> may be wrong.)
>> Of course this has no error checking and or niceties, but I will leave
>> that up to you.
> The same applies to my modifications.
> Good luck, and let us know if you need anything else!
> -Luke

Best Regards,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20091027/b9ab530d/attachment.htm>

More information about the Tutor mailing list