[Tutor] Compute data usage from log

Christian Witts cwitts at compuscan.co.za
Tue Oct 27 12:56:57 CET 2009


bibi midi wrote:
> #!/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
>
>
> #TODO: 
> #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 appreciated.
>
>
>
>
>
> On Mon, Oct 26, 2009 at 2:12 PM, Luke Paireepinart 
> <rabidpoobear at gmail.com <mailto:rabidpoobear at gmail.com>> wrote:
>
>
>
>     On Mon, Oct 26, 2009 at 3:20 AM, Christian Witts
>     <cwitts at compuscan.co.za <mailto: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,
> bibimidi
>
>

Exceptions:
* Not finding the log file would be IOError.
* Casting an alphanumeric or alpha string to integer would be a 
ValueError, in this context you won't have a None so you shouldn't need 
to worry about a TypeError
* Selecting the 10th element in your list can raise an IndexError if 
your line did not contain enough delimiters to create a large enough list.

Pedantic:
1MB = 1,024KB = 1,024*1,024B
So your total consumed should be div (1024*1024.0) or div 1048576.0

For the date you can look at the time module to get a nice string 
representation of the date/time.  Or as you said you want the last date 
listed in the log file then you could add something like

for line in open(log_file):
    last_log_date = ' '.join(line.split(' ')[:3]

which would take the first 3 elements in your list and combine them 
again.  Of course this is again just a simple representation of what to do.

-- 
Kind Regards,
Christian Witts




More information about the Tutor mailing list