zoukankan      html  css  js  c++  java
  • Python操作Excel_随机点菜脚本

     背景:
        中午快餐,菜单吃了个遍,天天纠结于不知道点啥菜。 
        想起读书考试时,丢纸团选答案,于是用python写个随机点菜脚本玩玩。

     功能:
          菜单为Excel,一个Sheet页为一个分类,每行显示每道菜的编号、菜名、价格,如下图所示。

          

         1、程序启动,程序提示选择分类,按输入的数字进入相应分类所在Sheet页(目前分类写死,只有3类)。
         2、 程序获取Sheet页最大行数,以此为上限,随机生成一个1到最大行数之间的数字。
         3、程序根据生成的随机数,读出该行的菜名、价格。
         4、程序总计可随机选菜3次,3次后退出,每次提示是否继续,是则继续,否则程序立即退出。
         5、若所选分类所在Sheet页总行数小于3,不能满足3次随机,则程序提示并退出。
         6、输入时,程序检查输入合法性,并给出相应提示。

    Python 2.7.5代码: 
     # coding=utf-8
    import sys
    import xlrd
    import random
    #打开菜单excel
    workbook = xlrd.open_workbook('D:\menu.xls')
    #计数器为0
    counters = 0
    #默认继续
    YesOrNo = 'y'
    while 1:
            #判断计数器,最多能选择3次
            if counters<3:
                #判断继续还是退出,默认是继续的
                if  YesOrNo=='y':
                    choose_num = raw_input('选择分类(1、小炒类|2、面食类|3、其他类):')
                    #判断选择的分类是否在三大类这中
                    if choose_num in ['1','2','3']:
                        #根据选择的分类,进入到相应Sheet页
                        excel_sheet = workbook.sheet_by_index(int(choose_num)-1)
                        #获取Sheet页的行数和列数
                        nrows_num = excel_sheet.nrows
                        ncols_num = excel_sheet.ncols
                        print
                        if nrows_num>3:
                                #生成一个随机数
                                random_num = random.randint(1,nrows_num-1)
                                #根据生成的随机数,获取到该行的菜名
                                name = excel_sheet.row(random_num)[1].value
                                #根据生成的随机数,获取到该行的价格
                                price = excel_sheet.row(random_num)[2].value
                                #输出获取到的分类、菜名、价格
                                print '-----第',counters+1,'次随机点菜结果:-----'.decode('utf-8')
                                print '      分类:',excel_sheet.name
                                print '      菜名:',name
                                print '      价格:'.decode('utf-8'),price,''.decode('utf-8')
                                #计数器+1
                                counters+=1
                                print
                                #提示是否继续?将输入内容英文小写化
                                YesOrNo = raw_input('是否继续?Y或N(不分大小写):').lower()
                                print
                        else:
                                print '该分类行数小于3,不支持3次随机,请修改!!!'
                                break
                    #判断输入的分类是否是1、2、3
                    else:
                        print '    只能输入1、2、3,请重新输入!'
                        print
                #判断是否继续输入n,则退出
                elif YesOrNo=='n':
                    print '你选择了退出!'
                    break
                #判断是否继续输入的值,非Y或N则继续要求输入
                else :
                    print '只能输入Y或N,Try Again:'
                    print
                    YesOrNo = raw_input('是否继续?Y或N(不分大小写):').lower()
                    print
            #判断计数器达到3次,程序退出
            else:
                print
                print '你已经选了三次,还不能确定要吃啥?你直接吃粑粑去吧!!!'
                break
    测试: 

              1、正常流,输入分类,打印出随机得到的结果,计数器达3次,程序退出:
                  

             2、校验‘分类’输入非法(中文、英文、分类之外数字、浮点数)时,给出相应提示:
                
       

         3、 校验‘是否继续’输入非法(中文、非Y或N之外的英文、浮点数)时,给出相应提示,输入N或n,则退出 :
              

        4、行数小于3时,不能满足3次随机,给出相应提示,程序退出:
                
     
       5、重复选择同一分类,结果如下(此处存在随机数重复的Bug,有待改进)
        

           
          
           Bug
             

           
  • 相关阅读:
    A query was run and no Result Maps were found for the Mapped Statement 'com.demo.dao.UserDao.check'. It's likely that neither a Result Type nor a Result Map was specified.
    layui监听input内容变动简单粗暴
    Java多线程中
    Java 对象内存分析
    MySQL重做日志
    并查集-Java实现
    java虚拟机类加载机制
    Java的23种设计模式概述
    redo log 有什么作用?
    什么是redo log ?
  • 原文地址:https://www.cnblogs.com/rmb-mylove123/p/3202035.html
Copyright © 2011-2022 走看看