[Tutor] Compute data usage from log
bibi midi
bibsmendez at gmail.com
Tue Oct 27 13:26:58 CET 2009
Hey Christian,
There seems to be a missing parenthesis in your join function below. Correct
me if I'm wrong.
I can live with ppp's time format for now. My script is not world-changing
anyway :-). How do i know I'm on the last line of the log file per the code
below? Just asking as I'm away from my linux box atm.
for line in open(log_file):
last_log_date = ' '.join(line.split(' ')[:3])
Thanks.
On Tue, Oct 27, 2009 at 2:56 PM, Christian Witts <cwitts at compuscan.co.za>wrote:
> 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
>
>
>
--
Best Regards,
bibimidi
Sent from Riyadh, 01, Saudi Arabia
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20091027/51cdb3e5/attachment.htm>
More information about the Tutor
mailing list