I am self taught in python. I love to play the lottery and play with numbers. I put this program together as a hobby to learn python and build something that people can use.I used and reused code throughout the program, so some variables in different methods are the same, but still accomplish the goal.Eventually I would like to build a GUI around this program, but I am not that far advanced yet. I was hoping to get some pointers and advice to improve the design.__author__ = 'Daniel Ynacay'import csvimport randomimport urllib2import timefrom itertools import groupbydef main():    # update all files for the program    update_all_files()    main_menu()''' control function so that every time the main() is called the program wont download all    the files again '''def run_once(f):    def wrapper(*args, **kwargs):        if not wrapper.has_run:            wrapper.has_run = True            return f(*args, **kwargs)    wrapper.has_run = False    return wrapper@run_oncedef update_all_files():    # this function downloads the cvs files needed for the program. 30 & 180 day numbers list.    pb_30 = 'http://www.wvlottery.com/assets/diw/downloads/powerball-numbers-30.csv'    mm_30 = 'http://www.wvlottery.com/assets/diw/downloads/megamillions-numbers-30.csv'    hl_30 = 'http://www.wvlottery.com/assets/diw/downloads/hotlotto-numbers-30.csv'    c25_30 = 'http://www.wvlottery.com/assets/diw/downloads/cash25-numbers-30.csv'    d3_30 = 'http://www.wvlottery.com/assets/diw/downloads/daily3-numbers-30.csv'    d4_30 = 'http://www.wvlottery.com/assets/diw/downloads/daily4-numbers-30.csv'    pb6 = 'http://www.wvlottery.com/assets/diw/downloads/powerball-numbers-180.csv'    mm6 = 'http://www.wvlottery.com/assets/diw/downloads/megamillions-numbers-180.csv'    hl6 = 'http://www.wvlottery.com/assets/diw/downloads/hotlotto-numbers-180.csv'    c26_6 = 'http://www.wvlottery.com/assets/diw/downloads/cash25-numbers-180.csv'    d3 = 'http://www.wvlottery.com/assets/diw/downloads/daily3-numbers-180.csv'    d4 = 'http://www.wvlottery.com/assets/diw/downloads/daily4-numbers-180.csv'    with open('powerball-numbers-180.csv', 'wb') as a:        a.write(urllib2.urlopen(pb6).read())        a.close()    with open('megamillions-numbers-180.csv', 'wb') as b:        b.write(urllib2.urlopen(mm6).read())        b.close()    with open('hotlotto-numbers-180.csv', 'wb') as c:        c.write(urllib2.urlopen(hl6).read())        c.close()    with open('cash25-numbers-180.csv', 'wb') as e:        e.write(urllib2.urlopen(c26_6).read())        e.close()    with open('daily3-numbers-180.csv', 'wb') as f:        f.write(urllib2.urlopen(d3).read())        f.close()    with open('daily4-numbers-180.csv', 'wb') as g:        g.write(urllib2.urlopen(d4).read())        g.close()    with open('powerball-numbers-30.csv', 'wb') as a:        a.write(urllib2.urlopen(pb_30).read())        a.close()    with open('megamillions-numbers-30.csv', 'wb') as b:        b.write(urllib2.urlopen(mm_30).read())        b.close()    with open('hotlotto-numbers-30.csv', 'wb') as c:        c.write(urllib2.urlopen(hl_30).read())        c.close()    with open('cash25-numbers-30.csv', 'wb') as e:        e.write(urllib2.urlopen(c25_30).read())        e.close()    with open('daily3-numbers-30.csv', 'wb') as f:        f.write(urllib2.urlopen(d3_30).read())        f.close()    with open('daily4-numbers-30.csv', 'wb') as g:        g.write(urllib2.urlopen(d4_30).read())        g.close()    print ('All files updated!')    main_menu()def main_menu():    # creates the menu    print ('Welcome to WV Lottery Tool.')    print ('Please choose from the following menu items')    print ()    print (Main Menu:               Type)    print (----------------------------)    print (Powerball Tool ---------- 1)    print (Mega Millions Tool ------ 2)    print (Hot Lotto Tool ---------- 3)    print (Cash 25 Tool  ----------- 4)    print (Daily Pick3 Tool -------- 5)    print (Daily Pick4 Tool -------- 6)    print (----------------------------)    # Get user input here    choice = raw_input('Please select your tool:')    # --------check to see if the user entered the correct data.----------    try:        choice = int(choice)    except ValueError:        print(Please type a number from the menu above!)        main()    if choice <= 0 or choice >= 7:        print (Please choose a number from the above menu)        main()    # --------------continue with program-----------------------    if choice == 1:        powerball_tool()    if choice == 2:        megamillions_tool()    if choice == 3:        hotlotto_tool()    if choice == 4:        cash25_tool()    if choice == 5:        daily3_tool()    if choice == 6:        daily4_tool()# ==================powerball_tool()==================== #def powerball_tool():    print('\n'*5)    # #=====GRAB JACKPOT STRING CODE======Grabs the estimated Jackpot update    response = urllib2.urlopen('http://www.wvlottery.com/draw-games/powerball/')    html = response.readlines()    jackpot = html[427]    jackpot = jackpot.strip()  # strips whitespace from both sides    jackpot1 = str(jackpot)[27:-7]  # This cuts the <span></span> tags.    # #===EMD GRAB JACKPOT STRING CODE==== 'jackpot1' variable is used=====    # ----------------------------------------------------------------    # BUILD MENU    print ('Welcome to the Powerball Tool!')    print '   ', jackpot1    print (Tool:                   Type)    print (----------------------------)    print (Easy Pick Tool ---------- 1)    print (Get Winning Numbers ----- 2)    print (See Month of PB Numbers-- 3)    print (6 Month Averages PB sets- 4)    print (Back to Main Menu ------- 5)    print (----------------------------)    print (\n * 1)    val = raw_input(Please select an option:)    try:        val = int(val)    except ValueError:        print(Please type a number from the menu above!)        powerball_tool()    if val <= 0 or val >= 6:        print (Please choose a number from the above menu)        powerball_tool()    if val == 1:        quick_pb_pick()    if val == 2:        check_pb_numbers()        powerball_tool()    if val == 3:        pbfm()        time.sleep(.3)        powerball_tool()    if val == 4:        get_all_avgs()    if val == 5:        main()def pb_easy_pick():    ball1 = random_number_gen()    ball2 = random_number_gen()    ball3 = random_number_gen()    ball4 = random_number_gen()    ball5 = random_number_gen()    pball = random.randint(1, 26)    white_set = [ball1, ball2, ball3, ball4, ball5]    white_sorted_set = sorted(white_set)    turn2str = str(white_sorted_set)[1:-1]    turnpb2str = str(pball)    addpbtext = ', PB'    finaloutput = turn2str + ' ' + addpbtext + ' ' + turnpb2str    # print white_sorted_set    # print len(white_sorted_set)    code = [len(list(group)) for key, group in groupby(white_sorted_set)]    if len(code) == 5:        print finaloutput    elif len(code) <= 4:        pb_easy_pick()def random_number_gen():    ball = random.randint(1, 69)    return balldef quick_pb_pick():    howmany = raw_input('How many Powerball sets? (max of 5:)')# #--------check to see if the user entered the correct data.----------    try:        howmany = int(howmany)    except ValueError:        print(Please choose a number between 1 - 5 !)        quick_pb_pick()    if howmany <= 0 or howmany >= 6:        print (Please choose a number between 1 - 5 !)    if howmany == 1:        print ''        print ''        pb_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 2:        print ''        print ''        for i in range(2):            pb_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 3:        print ''        print ''        for i in range(3):            pb_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 4:        print ''        print ''        for i in range(4):            pb_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 5:        print ''        print ''        for i in range(5):            pb_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    powerball_tool()# #===================BEGIN FUCNTION check_pb_numbers()=================#def check_pb_numbers():    with open(powerball-numbers-180.csv) as f1:        csv_f = csv.reader(f1)        for i, row in enumerate(csv_f):            print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)            if i >= 1:                raw_input('press enter to continue')                break# #===================END FUCNTION check_pb_numbers()=================#def pbfm():    f = open(powerball-numbers-30.csv)    csv_f = csv.reader(f)    for row in csv_f:        print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)    raw_input('press enter to continue')# #===========================GET ALL AVERAGAES FOR NUMBERS OVER 6 MONTHS=======start# This function is calls 6 functions that send back the average for a 6 month period for each ball in the powerball.def get_all_avgs():    print avg1ball(), ',', avg2ball(), ',', avg3ball(), ',', avg4ball(), ',', avg5ball(), ', PB', avgpball()    time.sleep(.2)    raw_input('press enter to continue')    powerball_tool()def avg1ball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column1 = 1        datatype = float        data1 = (datatype(row[column1]) for row in incsv)        least_value = sum(data1)/file_len('powerball-numbers-180.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg2ball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column2 = 2        datatype = float        data1 = (datatype(row[column2]) for row in incsv)        least_value = sum(data1)/file_len('powerball-numbers-180.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg3ball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column3 = 3        datatype = float        data1 = (datatype(row[column3]) for row in incsv)        least_value = sum(data1)/file_len('powerball-numbers-180.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg4ball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column4 = 4        datatype = float        data1 = (datatype(row[column4]) for row in incsv)        least_value = sum(data1)/file_len('powerball-numbers-180.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg5ball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column5 = 5        datatype = float        data1 = (datatype(row[column5]) for row in incsv)        least_value = sum(data1)/file_len('powerball-numbers-180.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avgpball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        powerballs = 6        datatype = float        data1 = (datatype(row[powerballs]) for row in incsv)        least_value = sum(data1)/file_len('powerball-numbers-180.csv') - 1        least_value = round(least_value, 1)    return least_value# #---------------------------- BEGIN MEGA MILLIONS CODE-------------------------------#def megamillions_tool():    print('\n' * 5)    # #=====GRAB JACKPOT STRING CODE======Grabs the estimated Jackpot update    response = urllib2.urlopen('http://www.wvlottery.com/draw-games/mega-millions/')    html = response.readlines()    jackpot = html[426]    jackpot = jackpot.strip()  # strips whitespace from both sides    jackpot1 = str(jackpot)[27:-7]  # This cuts the <span></span> tags.    # #===EMD GRAB JACKPOT STRING CODE==== 'jackpot1' variable is used=====    # ----------------------------------------------------------------    # BUILD MENU    print ('Welcome to the Mega Millions Tool!')    print '   ', jackpot1    print (Tool:                   Type)    print (----------------------------)    print (Easy Pick Tool ---------- 1)    print (Get Winning Numbers ----- 2)    print (See Month of MM Numbers-- 3)    print (6 Month Averages MM sets- 4)    print (Back to Main Menu ------- 5)    print (----------------------------)    print (\n * 1)    val = raw_input(Please select an option:)    try:        val = int(val)    except ValueError:        print(Please type a number from the menu above!)        megamillions_tool()    if val <= 0 or val >= 7:        print (Please choose a number from the above menu)        megamillions_tool()    if val == 1:        quick_mm_pick()    if val == 2:        check_mm_numbers()        megamillions_tool()    if val == 3:        mmfm()        time.sleep(.3)        megamillions_tool()    if val == 4:        get_allmm_avgs()    if val == 5:        main()def mm_easy_pick():    ball1 = randommm_number_gen()    ball2 = randommm_number_gen()    ball3 = randommm_number_gen()    ball4 = randommm_number_gen()    ball5 = randommm_number_gen()    pball = random.randint(1, 15)    white_set = [ball1, ball2, ball3, ball4, ball5]    white_sorted_set = sorted(white_set)    turn2str = str(white_sorted_set)[1:-1]    turnpb2str = str(pball)    addpbtext = ', MB'    finaloutput = turn2str + ' ' + addpbtext + ' ' + turnpb2str    # print white_sorted_set    # print len(white_sorted_set)    code = [len(list(group)) for key, group in groupby(white_sorted_set)]    if len(code) == 5:        print finaloutput    elif len(code) <= 4:        mm_easy_pick()def randommm_number_gen():    ball = random.randint(1, 75)    return balldef quick_mm_pick():    howmany = raw_input('How many Mega Millions sets? (max of 5:)')    # #--------check to see if the user entered the correct data.----------    try:        howmany = int(howmany)    except ValueError:        print(Please choose a number between 1 - 5 !)        quick_mm_pick()    if howmany <= 0 or howmany >= 6:        print (Please choose a number between 1 - 5 !)    if howmany == 1:        print ''        print ''        mm_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 2:        print ''        print ''        for i in range(2):            mm_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 3:        print ''        print ''        for i in range(3):            mm_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 4:        print ''        print ''        for i in range(4):            mm_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 5:        print ''        print ''        for i in range(5):            mm_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    megamillions_tool()# #===================BEGIN FUCNTION check_pb_numbers()=================#def check_mm_numbers():    with open(megamillions-numbers-180.csv) as f1:        csv_f = csv.reader(f1)        for i, row in enumerate(csv_f):            print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)            if i >= 1:                raw_input('press enter to continue')                break# #===================END FUCNTION check_pb_numbers()=================#def mmfm():    f = open(megamillions-numbers-30.csv)    csv_f = csv.reader(f)    for row in csv_f:        print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)    raw_input('press enter to continue')''' #===========================GET ALL AVERAGAES FOR NUMBERS OVER 6      MONTHS=======start''''''# This function is calls 6 functions that send back the average for a6 month period for each ball in the powerball.'''def get_allmm_avgs():    print avg1mball(), ',', avg2mball(), ',', avg3mball(), ',', avg4mball(), ',', avg5mball(), ', MB', avgmmball()    time.sleep(.2)    raw_input('press enter to continue')    megamillions_tool()def avg1mball():    with open('powerball-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column1 = 1        datatype = float        data1 = (datatype(row[column1]) for row in incsv)        least_value = sum(data1) / file_len('megamillions-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg2mball():    with open('megamillions-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column2 = 2        datatype = float        data1 = (datatype(row[column2]) for row in incsv)        least_value = sum(data1) / file_len('megamillions-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg3mball():    with open('megamillions-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column3 = 3        datatype = float        data1 = (datatype(row[column3]) for row in incsv)        least_value = sum(data1) / file_len('megamillions-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg4mball():    with open('megamillions-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column4 = 4        datatype = float        data1 = (datatype(row[column4]) for row in incsv)        least_value = sum(data1) / file_len('megamillions-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg5mball():    with open('megamillions-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column5 = 5        datatype = float        data1 = (datatype(row[column5]) for row in incsv)        least_value = sum(data1) / file_len('megamillions-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avgmmball():    with open('megamillions-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        powerballs = 6        datatype = float        data1 = (datatype(row[powerballs]) for row in incsv)        least_value = sum(data1) / file_len('megamillions-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_value# #======================================End get all averages============================## #---------------------------- END -  MEGA MILLIONS CODE-------------------------------#def hotlotto_tool():    print('\n' * 5)    # #=====GRAB JACKPOT STRING CODE======Grabs the estimated Jackpot update    # http://www.wvlottery.com/assets/diw/downloads/hotlotto-numbers-180.csv    response = urllib2.urlopen('http://www.wvlottery.com/draw-games/hot-lotto/')    html = response.readlines()    jackpot = html[426]    jackpot = jackpot.strip()  # strips whitespace from both sides    jackpot1 = str(jackpot)[27:-7]  # This cuts the <span></span> tags.    # #===EMD GRAB JACKPOT STRING CODE==== 'jackpot1' variable is used=====    # ----------------------------------------------------------------    # BUILD MENU    print ('Welcome to the Hot Lotto Tool!')    print '   ', jackpot1    print (Tool:                   Type)    print (----------------------------)    print (Easy Pick Tool ---------- 1)    print (Get Winning Numbers ----- 2)    print (See Month of HL Numbers-- 3)    print (6 Month Averages HL sets- 4)    print (Back to Main Menu ------- 5)    print (----------------------------)    print (\n * 1)    val = raw_input(Please select an option:)    try:        val = int(val)    except ValueError:        print(Please type a number from the menu above!)        hotlotto_tool()    if val <= 0 or val >= 7:        print (Please choose a number from the above menu)        hotlotto_tool()    if val == 1:        quick_hl_pick()    if val == 2:        check_hl_numbers()        hotlotto_tool()    if val == 3:        hlfm()        time.sleep(.3)        hotlotto_tool()    if val == 4:        get_allhl_avgs()    if val == 5:        main()def hl_easy_pick():    ball1 = randomhl_number_gen()    ball2 = randomhl_number_gen()    ball3 = randomhl_number_gen()    ball4 = randomhl_number_gen()    ball5 = randomhl_number_gen()    pball = random.randint(1, 19)    white_set = [ball1, ball2, ball3, ball4, ball5]    white_sorted_set = sorted(white_set)    turn2str = str(white_sorted_set)[1:-1]    turnpb2str = str(pball)    addpbtext = ', HB'    finaloutput = turn2str + ' ' + addpbtext + ' ' + turnpb2str    # print white_sorted_set    # print len(white_sorted_set)    code = [len(list(group)) for key, group in groupby(white_sorted_set)]    if len(code) == 5:        print finaloutput    elif len(code) <= 4:        hl_easy_pick()def randomhl_number_gen():    ball = random.randint(1, 47)    return balldef quick_hl_pick():    howmany = raw_input('How many Hot Lotto sets? (max of 5:)')    # #--------check to see if the user entered the correct data.----------    try:        howmany = int(howmany)    except ValueError:        print(Please choose a number between 1 - 5 !)        quick_hl_pick()    if howmany <= 0 or howmany >= 6:        print (Please choose a number between 1 - 5 !)    if howmany == 1:        print ''        print ''        hl_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 2:        print ''        print ''        for i in range(2):            hl_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 3:        print ''        print ''        for i in range(3):            hl_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 4:        print ''        print ''        for i in range(4):            hl_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 5:        print ''        print ''        for i in range(5):            hl_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    hotlotto_tool()# #===================BEGIN FUCNTION check_pb_numbers()=================#def check_hl_numbers():    with open(hotlotto-numbers-180.csv) as f1:        csv_f = csv.reader(f1)        for i, row in enumerate(csv_f):            print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)            if i >= 1:                raw_input('press enter to continue')                break  # #keyword that ends this function and returns to the calling function.# #===================END FUCNTION check_pb_numbers()=================#def hlfm():    f = open(hotlotto-numbers-30.csv)    csv_f = csv.reader(f)    for row in csv_f:        print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)    raw_input('press enter to continue')# #===========================GET ALL AVERAGAES FOR NUMBERS OVER 6 MONTHS=======start# This function is calls 6 functions that send back the average for a 6 month period for each ball in the powerball.def get_allhl_avgs():    print avg1hlball(), ',', avg2hlball(), ',', avg3hlball(), ',', avg4hlball(), ',', avg5hlball(), ', HB', avghlball()    time.sleep(.2)    raw_input('press enter to continue')    hotlotto_tool()def avg1hlball():    with open('hotlotto-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column1 = 1        datatype = float        data1 = (datatype(row[column1]) for row in incsv)        least_value = sum(data1) / file_len('hotlotto-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg2hlball():    with open('hotlotto-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column2 = 2        datatype = float        data1 = (datatype(row[column2]) for row in incsv)        least_value = sum(data1) / file_len('hotlotto-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg3hlball():    with open('hotlotto-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column3 = 3        datatype = float        data1 = (datatype(row[column3]) for row in incsv)        least_value = sum(data1) / file_len('hotlotto-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg4hlball():    with open('hotlotto-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column4 = 4        datatype = float        data1 = (datatype(row[column4]) for row in incsv)        least_value = sum(data1) / file_len('hotlotto-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg5hlball():    with open('hotlotto-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column5 = 5        datatype = float        data1 = (datatype(row[column5]) for row in incsv)        least_value = sum(data1) / file_len('hotlotto-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avghlball():    with open('hotlotto-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        powerballs = 6        datatype = float        data1 = (datatype(row[powerballs]) for row in incsv)        least_value = sum(data1) / file_len('hotlotto-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef cash25_tool():    print('\n' * 2)    # BUILD MENU    print ('Welcome to the Cash 25 Tool!')    print '   '    print (Tool:                   Type)    print (----------------------------)    print (Easy Pick Tool ---------- 1)    print (Get Winning Numbers ----- 2)    print (Month of Cash 25 Numbers- 3)    print (6 Month Avg Cash 25 ----- 4)    print (Back to Main Menu ------- 5)    print (----------------------------)    print (\n * 1)    val = raw_input(Please select an option:)    try:        val = int(val)    except ValueError:        print(Please type a number from the menu above!)        cash25_tool()    if val <= 0 or val >= 7:        print (Please choose a number from the above menu)        cash25_tool()    if val == 1:        quick_c25_pick()    if val == 2:        check_c25_numbers()        cash25_tool()    if val == 3:        c25fm()        time.sleep(.3)        cash25_tool()    if val == 4:        get_allc25_avgs()    if val == 5:        main()def c25_easy_pick():    ball1 = random_c25number_gen()    ball2 = random_c25number_gen()    ball3 = random_c25number_gen()    ball4 = random_c25number_gen()    ball5 = random_c25number_gen()    white_set = [ball1, ball2, ball3, ball4, ball5]    white_sorted_set = sorted(white_set)    turn2str = str(white_sorted_set)[1:-1]    finaloutput = turn2str    ''' The code below checks for duplicate numbers in the white_sorted_set variable,        if there is less than 5 unique numbers the c25_easy_pick() is run again.'''    code = [len(list(group)) for key, group in groupby(white_sorted_set)]    if len(code) == 5:        print finaloutput    elif len(code) <= 4:        c25_easy_pick()def random_c25number_gen():    ball = random.randint(1, 25)    return balldef quick_c25_pick():    howmany = raw_input('How many Cash 25 sets? (max of 5:)')    # #--------check to see if the user entered the correct data.----------    try:        howmany = int(howmany)    except ValueError:        print(Please choose a number between 1 - 5 !)        quick_c25_pick()    if howmany <= 0 or howmany >= 6:        print (Please choose a number between 1 - 5 !)    if howmany == 1:        print ''        print ''        c25_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 2:        print ''        print ''        for i in range(2):            c25_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 3:        print ''        print ''        for i in range(3):            c25_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 4:        print ''        print ''        for i in range(4):            c25_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 5:        print ''        print ''        for i in range(5):            c25_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    cash25_tool()# #===================BEGIN FUCNTION check_c25_numbers()=================#def check_c25_numbers():    with open(cash25-numbers-180.csv) as f1:        csv_f = csv.reader(f1)        for i, row in enumerate(csv_f):            print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)            if i >= 1:                raw_input('press enter to continue')                break# #===================END FUCNTION check_pb_numbers()=================#def c25fm():    f = open(cash25-numbers-30.csv)    csv_f = csv.reader(f)    for row in csv_f:        print '{:<13}{:^10}{:^10}{:^10}{:^10}{:^10}{:^8}'.format(*row)    raw_input('press enter to continue')    # #===========================GET ALL AVERAGAES FOR NUMBERS OVER 6 MONTHS=======start# This function is calls 6 functions that send back the average for a 6 month period for each ball in the powerball.def get_allc25_avgs():    print avg1c25ball(), ',', avg2c25ball(), ',', avg3c25ball(), ',', avg4c25ball(), ',', avg5c25ball(), ',',\        avgc25ball()    time.sleep(.2)    raw_input('press enter to continue')    cash25_tool()def avg1c25ball():    with open('cash25-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column1 = 1        datatype = float        data1 = (datatype(row[column1]) for row in incsv)        least_value = sum(data1) / file_len('cash25-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg2c25ball():    with open('cash25-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column2 = 2        datatype = float        data1 = (datatype(row[column2]) for row in incsv)        least_value = sum(data1) / file_len('cash25-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg3c25ball():    with open('cash25-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column3 = 3        datatype = float        data1 = (datatype(row[column3]) for row in incsv)        least_value = sum(data1) / file_len('cash25-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg4c25ball():    with open('cash25-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column4 = 4        datatype = float        data1 = (datatype(row[column4]) for row in incsv)        least_value = sum(data1) / file_len('cash25-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg5c25ball():    with open('cash25-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column5 = 5        datatype = float        data1 = (datatype(row[column5]) for row in incsv)        least_value = sum(data1) / file_len('cash25-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avgc25ball():    with open('cash25-numbers-180.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row http://www.wvlottery.com/assets/diw/downloads/cash25-numbers-180.csv        powerballs = 6        datatype = float        data1 = (datatype(row[powerballs]) for row in incsv)        least_value = sum(data1) / file_len('cash25-numbers-180.csv') - 1        least_value = round(least_value, 2)    return least_value# #---------------------------- END -  Cash 25 CODE-------------------------------#def daily3_tool():    print('\n' * 2)    # ----------------------------------------------------------------    # BUILD MENU    print ('Welcome to the Daily 3 Tool!')    print '   '    print (Tool:                   Type)    print (----------------------------)    print (Easy Pick Tool ---------- 1)    print (Get Winning Numbers ----- 2)    print (Month of Daily 3 Numbers- 3)    print (1 Month Avg Daily 3 ----- 4)    print (Back to Main Menu ------- 5)    print (----------------------------)    print (\n * 1)    val = raw_input(Please select an option:)    try:        val = int(val)    except ValueError:        print(Please type a number from the menu above!)        daily3_tool()    if val <= 0 or val >= 7:        print (Please choose a number from the above menu)        daily3_tool()    if val == 1:        quick_d3_pick()    if val == 2:        check_d3_numbers()        daily3_tool()    if val == 3:        d3fm()        time.sleep(.3)        daily3_tool()    if val == 4:        get_alld3_avgs()    if val == 5:        main()def d3_easy_pick():    ball1 = random_d3number_gen()    ball2 = random_d3number_gen()    ball3 = random_d3number_gen()    white_set = [ball1, ball2, ball3]    # white_sorted_set = sorted(white_set)    turn2str = str(white_set)[1:-1]    # turnpb2str = str(pball)    # addpbtext = ', HB'    # finaloutput = turn2str + ' '  ' ' + turnpb2str    print turn2str    # print len(white_sorted_set)def random_d3number_gen():    ball = random.randint(0, 9)    return balldef quick_d3_pick():    howmany = raw_input('How many Daily 3 sets? (max of 5:)')    # #--------check to see if the user entered the correct data.----------    try:        howmany = int(howmany)    except ValueError:        print(Please choose a number between 1 - 5 !)        quick_d3_pick()    if howmany <= 0 or howmany >= 6:        print (Please choose a number between 1 - 5 !)    if howmany == 1:        print ''        print ''        d3_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 2:        print ''        print ''        for i in range(2):            d3_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 3:        print ''        print ''        for i in range(3):            d3_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 4:        print ''        print ''        for i in range(4):            d3_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    if howmany == 5:        print ''        print ''        for i in range(5):            d3_easy_pick(), '\n'        print ''        print ''        raw_input('press enter to continue')    daily3_tool()# #===================BEGIN FUCNTION check_c25_numbers()=================#def check_d3_numbers():    with open(daily3-numbers-180.csv) as f1:        csv_f = csv.reader(f1)        for i, row in enumerate(csv_f):            print '{:<13}{:^10}{:^10}{:^10}'.format(*row)            if i >= 1:                raw_input('press enter to continue')                break# #===================END FUCNTION check_pb_numbers()=================#def d3fm():    f = open(daily3-numbers-30.csv)    csv_f = csv.reader(f)    for row in csv_f:        print '{:<13}{:^10}{:^10}{:^10}'.format(*row)    raw_input('press enter to continue')    # #===========================GET ALL AVERAGAES FOR NUMBERS OVER 1 MONTH=======start# This function is calls 6 functions that send back the average for a 6 month period for each ball in the powerball.def get_alld3_avgs():    print avg1d3ball(), ',', avg2d3ball(), ',', avg3d3ball()    time.sleep(.2)    raw_input('press enter to continue')    daily3_tool()def avg1d3ball():    with open('daily3-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column1 = 1        datatype = float        data1 = (datatype(row[column1]) for row in incsv)        least_value = sum(data1) / file_len('daily3-numbers-30.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg2d3ball():    with open('daily3-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column2 = 2        datatype = float        data1 = (datatype(row[column2]) for row in incsv)        least_value = sum(data1) / file_len('daily3-numbers-30.csv') - 1        least_value = round(least_value, 2)    return least_valuedef avg3d3ball():    with open('daily3-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column3 = 3        datatype = float        data1 = (datatype(row[column3]) for row in incsv)        least_value = sum(data1) / file_len('daily3-numbers-30.csv') - 1        least_value = round(least_value, 2)    return least_value# #======================================End get all averages============================## #---------------------------- END -  Daily 3 CODE-------------------------------#def daily4_tool():    print('\n' * 2)    # ----------------------------------------------------------------    # BUILD MENU    print ('Welcome to the Daily 4 Tool!')    print '   '    print (Tool:                   Type)    print (----------------------------)    print (Easy Pick Tool ---------- 1)    print (Get Winning Numbers ----- 2)    print (Month of Daily 4 Numbers- 3)    print (1 Month Avg Daily 4 ----- 4)    print (Back to Main Menu ------- 5)    print (----------------------------)    print (\n * 1)    val = raw_input(Please select an option:)    try:        val = int(val)    except ValueError:        print(Please type a number from the menu above!)        daily4_tool()    if val <= 0 or val >= 7:        print (Please choose a number from the above menu)        daily4_tool()    if val == 1:        quick_d4_pick()    if val == 2:        check_d4_numbers()        daily4_tool()    if val == 3:        d4fm()        time.sleep(.3)        daily4_tool()    if val == 4:        get_alld4_avgs()    if val == 5:        main()def d4_easy_pick():    ball1 = random_d4number_gen()    ball2 = random_d4number_gen()    ball3 = random_d4number_gen()    ball4 = random_d4number_gen()    white_set = [ball1, ball2, ball3, ball4]    # white_sorted_set = sorted(white_set)    turn2str = str(white_set)[1:-1]    # turnpb2str = str(pball)    # addpbtext = ', HB'    # finaloutput = turn2str + ' '  ' ' + turnpb2str    print turn2str    # print len(white_sorted_set)def random_d4number_gen():    ball = random.randint(0, 9)    return balldef quick_d4_pick():    howmany = raw_input('How many Daily 4 sets? (max of 5:)')    # #--------check to see if the user entered the correct data.----------    try:        howmany = int(howmany)    except ValueError:        print(Please choose a number between 1 - 5 !)        quick_d4_pick()    if howmany <= 0 or howmany >= 6:        print (Please choose a number between 1 - 5 !)    if howmany == 1:        print ''        d4_easy_pick(), '\n'        print ''        raw_input('press enter to continue')    if howmany == 2:        print ''        for i in range(2):            d4_easy_pick(), '\n'        print ''        raw_input('press enter to continue')    if howmany == 3:        print ''        for i in range(3):            d4_easy_pick(), '\n'        print ''        raw_input('press enter to continue')    if howmany == 4:        print ''        for i in range(4):            d4_easy_pick(), '\n'        print ''        raw_input('press enter to continue')    if howmany == 5:        print ''        for i in range(5):            d4_easy_pick(), '\n'        print ''        raw_input('press enter to continue')    daily4_tool()# #===================BEGIN FUCNTION check_c25_numbers()=================#def check_d4_numbers():    with open(daily4-numbers-180.csv) as f1:        csv_f = csv.reader(f1)        for i, row in enumerate(csv_f):            print '{:<13}{:^10}{:^10}{:^10}{:^10}'.format(*row)            if i >= 1:                raw_input('press enter to continue')                break# #===================END FUCNTION check_pb_numbers()=================#def d4fm():    f = open(daily4-numbers-30.csv)    csv_f = csv.reader(f)    for row in csv_f:        print '{:<13}{:^10}{:^10}{:^10}{:^10}'.format(*row)    raw_input('press enter to continue')    # #===========================GET ALL AVERAGAES FOR NUMBERS OVER 6 MONTHS=======start# This function is calls 6 functions that send back the average for a 6 month period for each ball in the powerball.def get_alld4_avgs():    print avg1d4ball(), ',', avg2d4ball(), ',', avg3d4ball(), ',', avg4d4ball()    time.sleep(.2)    raw_input('press enter to continue')    daily4_tool()def avg1d4ball():    with open('daily4-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column1 = 1        datatype = float        data1 = (datatype(row[column1]) for row in incsv)        least_value = sum(data1) / file_len('daily4-numbers-30.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg2d4ball():    with open('daily4-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column2 = 2        datatype = float        data1 = (datatype(row[column2]) for row in incsv)        least_value = sum(data1) / file_len('daily4-numbers-30.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg3d4ball():    with open('daily4-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column3 = 3        datatype = float        data1 = (datatype(row[column3]) for row in incsv)        least_value = sum(data1) / file_len('daily4-numbers-30.csv') - 1        least_value = round(least_value, 1)    return least_valuedef avg4d4ball():    with open('daily4-numbers-30.csv', 'rb') as inf:        has_header = csv.Sniffer().has_header(inf.read(1024))        inf.seek(0)  # rewind        incsv = csv.reader(inf)        if has_header:            next(incsv)  # skip header row        column4 = 4        datatype = float        data1 = (datatype(row[column4]) for row in incsv)        least_value = sum(data1) / file_len('daily4-numbers-30.csv') - 1        least_value = round(least_value, 1)    return least_value# #======================================End get all averages============================## #---------------------------- END -  Daily 4 CODE-------------------------------#def file_len(fname):    with open(fname) as f:        for i, l in enumerate(f):            pass    return i + 1main()
WV lottery tool in Python
python;beginner;python 2.7;random;csv