[Tutor] Organizing my code, should I use functions?
bob gailer
bgailer at gmail.com
Wed Apr 22 20:15:23 CEST 2009
Please use reply-all so a copy goes to the list.
Eduardo Vieira wrote:
> On Wed, Apr 22, 2009 at 9:47 AM, bob gailer <bgailer at gmail.com> wrote:
>
>> Eduardo Vieira wrote:
>>
>>> Hello! I’m not a programmer
>>>
>> Do you mean that you were not a programmer and are now becoming one?
>>
>>
>
> In a way yes, I am aspiring to be one, but because of circumstances in
> my life I won't be going to take schooling for that.
>
>
>
>> To convert to a function ask: - what are the inputs? - what are the outputs?
>>
>> The input I see is the excel file name. The outputs I see are # shipped
>> today and total # shipped.
>>
>> That leads to a function:
>>
>> def getShipmentInfo(xlfilename): # specify the input(s) here
>> ###### --- Code to find the right cell with today's shipments
>> book = xlrd.open_workbook(xlfilename)
>> thisDay = time.gmtime()[:3]
>> dayexcel = xlrd.xldate.xldate_from_date_tuple(thisDay, book.datemode)
>> thismonth = time.strftime('%B', time.gmtime()) sh =
>> book.sheet_by_name(thismonth) firstCol = sh.col_values(0) tperday =
>> firstCol.index('TOTAL Per Day') shipindex = tperday + 1 for valores in
>> sh.col_values(cols):
>> if valores == dayexcel: todaysList = sh.col_values(cols)
>> totals = sh.row_values(shipindex, end_colx=cols + 1)
>> break
>> shipped = todaysList[shipindex]
>> total = sum([a for a in totals if type(a) == type(2.0)])
>> return shipped, total # specify the output(s) here
>>
>> Eliminate unused statements and whitespace.
>> Put the main program in a main function (reason 3) above)
>> The program now looks like:
>>
>> ## This script creates a report of shipments ## comparing the numbers from
>> the previous year with the current year.
>> import xlrd # Package to read Excel files import time import datetime def
>> main():
>> # Two excel files to process with shipping information
>> thisyearFile = r'c:\Shipping Totals - 2009\Shipping Totals 2009 West.xls'
>> prevyearFile = r'c:\Shipping Totals\Shipping Totals - 2008\ShippingTotals
>> 2008 West.xls'
>> shippedToday, totalShipments = getShipmentInfo(thisyearFile)
>> shippedLastYear, OldTotalShipments = getShipmentInfo(prevyearFile)
>>
>> # Imports the information from the Eastern division. See code on the
>> bottom
>> .... rest of main program
>> def getShipmentInfo(xlfilename): # specify the input(s) here
>> .... rest of function code from above
>> if __name__ == "__main__":
>> main()
>>
>>
> Thank you for your help. I guess actually I will have to create 2
> functions: one for this year, and other for the previous year, right?
> Because the calculations are different, as you can see in my original
> code.
>
The ONLY difference I can see is the use of current vs prior year, which
I missed.
I also noticed that my code got clobbered, as did yours, by the email
program.
I will attempt to get it right this time and fix the year problem.
add to main program:
thisDay = time.gmtime()[:3]
aYearAgo = prevyear.timetuple()[:3]
modify function:
def getShipmentInfo(xlfilename, day): # specify the input(s) here
###### --- Code to find the right cell with today's shipments
book = xlrd.open_workbook(xlfilename)
thisDay = time.gmtime()[:3]
dayexcel = xlrd.xldate.xldate_from_date_tuple(day, book.datemode)
thismonth = time.strftime('%B', time.gmtime())
sh = book.sheet_by_name(thismonth)
firstCol = sh.col_values(0)
tperday = firstCol.index('TOTAL Per Day')
shipindex = tperday + 1
for cols in range(sh.ncols):
for valores in sh.col_values(cols):
if valores == dayexcel:
todaysList = sh.col_values(cols)
totals = sh.row_values(shipindex, end_colx=cols + 1)
break
shipped = todaysList[shipindex]
total = sum([a for a in totals if type(a) == type(2.0)])
return shipped, total # specify the output(s) here
modify calls to function:
shippedToday, totalShipments = getShipmentInfo(thisyearFile, thisDay)
shippedLastYear, OldTotalShipments = getShipmentInfo(prevyearFile, aYearAgo)
Now the 1 function should do what you want.
>
>
>> This is not the only way to use functions or improve things.
>>
>> I leave dealing with the east data to someone else, but I think we can apply
>> the same principles.
>>
>>
>>> Here is the code:
>>>
>>> ## This script creates a report of shipments ## comparing the numbers
>>> from the previous year with the current year.
>>>
>>> import xlrd # Package to read Excel files import os import glob import
>>> time import datetime import dbi import odbc
>>>
>>>
>>>
>>>
>>> thismonth = time.strftime('%B', time.gmtime()) # Get's a string with
>>> the name of the current month
>>>
>>> hoje = time.strftime("%a, %b %d, %Y", time.gmtime())
>>>
>>>
>>> # Two excel files to process with shipping information
>>>
>>> thisyearFile = r'c:\Shipping Totals - 2009\Shipping Totals 2009 West.xls'
>>> prevyearFile = r'c:\Shipping Totals\Shipping Totals - 2008\Shipping
>>> Totals 2008 West.xls'
>>>
>>>
>>>
>>> thisDay = time.gmtime()[:3]
>>> prevyear = datetime.datetime.today() - datetime.timedelta(days=365)
>>> aYearAgo = prevyear.timetuple()[:3]
>>>
>>> ###### --- Code to find the right cell with today's shipments
>>>
>>> book = xlrd.open_workbook(thisyearFile) # Opens excel file
>>>
>>> dayexcel = xlrd.xldate.xldate_from_date_tuple(thisDay, book.datemode)
>>> #Puts the date in the Excel format, like 3991.0
>>>
>>>
>>> sh = book.sheet_by_name(thismonth) # The sheet which has the name of
>>> the month: April, May, June, etc.
>>>
>>> firstCol = sh.col_values(0) # Retrieves the first column
>>>
>>> tperday = firstCol.index('TOTAL Per Day') # Finds the cell 'Total Per Day'
>>>
>>> shipindex = tperday + 1 # The next cell after 'TOTAL Per Day', which
>>> contains the info about shipments
>>>
>>> # Looks for the column whose header is today's date for cols in
>>> range(sh.ncols):
>>> for valores in sh.col_values(cols):
>>> if valores == dayexcel: # If it finds the column with today's date
>>> todaysList = sh.col_values(cols)
>>> totals = sh.row_values(shipindex, end_colx=cols + 1) # sum
>>> up to the current date
>>> break
>>>
>>> # Crosses rows with column to find the right cell with the shipments
>>> of today shippedToday = todaysList[shipindex]
>>>
>>> totalShipments = sum([a for a in totals if type(a) == type(2.0)]) #
>>> Sums all shipments
>>>
>>>
>>> # Check previous year's shipments processing the file with last year's
>>> data
>>>
>>> booktwo = xlrd.open_workbook(prevyearFile)
>>>
>>> dayexcel = xlrd.xldate.xldate_from_date_tuple(aYearAgo, book.datemode)
>>>
>>> sh = booktwo.sheet_by_name(thismonth)
>>>
>>> firstCol = sh.col_values(0)
>>>
>>>
>>>
>>> tperday = firstCol.index('TOTAL Per Day')
>>>
>>> shipindex = tperday + 1
>>>
>>> for cols in range(sh.ncols):
>>> for valores in sh.col_values(cols):
>>> if valores == dayexcel:
>>> lastyearsList = sh.col_values(cols)
>>> totals = sh.row_values(shipindex, end_colx=cols + 1) # sum
>>> up to the current date
>>> break
>>>
>>>
>>> shippedLastYear = lastyearsList[shipindex]
>>>
>>>
>>> OldTotalShipments = sum([a for a in totals if type(a) == type(2.0)])
>>>
>>>
>>> # Imports the information from the Eastern division. See code on the
>>> bottom
>>>
>>> import bizreportereast as bz
>>>
>>>
>>> report = """
>>>
>>>
>>> ===== Shipments Alberta Warehouse =====
>>>
>>> - Shipments today: %d
>>>
>>> - Shipments this month: %d
>>>
>>> - Shipments this day, last year: %d
>>>
>>> - Shipments this month, last year: %d
>>>
>>>
>>> ===== Shipments Ontario Warehouse =====
>>>
>>> - Shipments today: %d
>>>
>>> - Shipments this month: %d
>>>
>>> - Shipments this day, last year: %d
>>>
>>> - Shipments this month, last year: %d
>>>
>>>
>>> """ % (shippedToday, totalShipments, shippedLastYear,
>>> OldTotalShipments, bz.shippedToday, bz.totalShipments,
>>> bz.shippedLastYear, bz.OldTotalShipments)
>>>
>>> print report
>>>
>>> logfile = open('c:/myscripts/logbizreport.log', 'a')
>>>
>>>
>>> #### Code found in bizreportereast.py #### import xlrd import os
>>> import glob import time import datetime
>>>
>>>
>>> ###### --- Code to find the right cell with today's shipments
>>>
>>> thismonth = time.strftime('%B', time.gmtime())
>>>
>>> hoje = time.strftime("%a, %b %d, %Y", time.gmtime())
>>>
>>> thisyearFile = r'c:\MS Excel\Shipping Totals\Shipping Totals -
>>> 2009\Shipping Totals 2009 East.xls'
>>> prevyearFile = r'c:\MS Excel\Shipping Totals\Shipping Totals -
>>> 2008\Shipping Totals 2008 East.xls'
>>>
>>>
>>>
>>> thisDay = time.gmtime()[:3]
>>> prevyear = datetime.datetime.today() - datetime.timedelta(days=365)
>>> aYearAgo = prevyear.timetuple()[:3]
>>>
>>>
>>>
>>> book = xlrd.open_workbook(thisyearFile)
>>>
>>> dayexcel = xlrd.xldate.xldate_from_date_tuple(thisDay, book.datemode)
>>>
>>>
>>> sh = book.sheet_by_name(thismonth)
>>>
>>> firstCol = sh.col_values(0)
>>> _______________________________________________
>>> Tutor maillist - Tutor at python.org
>>> http://mail.python.org/mailman/listinfo/tutor
>>>
>>>
>>>
>> --
>> Bob Gailer
>> Chapel Hill NC
>> 919-636-4239
>>
>>
>
>
--
Bob Gailer
Chapel Hill NC
919-636-4239
More information about the Tutor
mailing list