背景:
    中午快餐,菜单吃了个遍,天天纠结于不知道点啥菜。 
    想起读书考试时,丢纸团选答案,于是用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 ['','','']:
#根据选择的分类,进入到相应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:
         
       

Python操作Excel_随机点菜脚本的更多相关文章

  1. Python操作Excel_输出所有内容(包含中文)

    python 2.7.5代码: # coding=utf-8 import sys import xlrd data=xlrd.open_workbook('D:\\menu.xls') table ...

  2. Python操作12306抢票脚本

    有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西.在了解了一些技术手段,阅读了一些大神的博文 ...

  3. Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  4. Python学习笔记 - day12 - Python操作NoSQL

    NoSQL(非关系型数据库) NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数据的存储.(例如 ...

  5. 【转】Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  6. python操作RabbitMQ(不错)

    一.rabbitmq RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  7. python操作RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  8. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  9. Python操作RabbitMQ

    RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消 ...

随机推荐

  1. Java-struts2 通过MODEL接收表单数据的方法

    接收数据的时候经常会出问题: 1.记住action = “”到的路径,最好用全路径 <a href="../Struts/user/hello?user.name=xxzzzzzzzz ...

  2. C#结构内存布局介绍

    转载:http://www.csharpwin.com/csharpspace/10455r2800.shtml 本来打算写一篇文章,详细地讨论一下结构的内存布局,但是想了下,跟路西菲尔的这篇文章也差 ...

  3. asp.net - GridView根据linkButton值不同跳转不同页面

    一,当前页面中,前台界面的主要代码: <asp:TemplateField HeaderText="姓名"> <ItemTemplate> <!--根 ...

  4. setTimeout 和 setInterval区别

    setTimeout和setIntelval都有定时的功能!!!取消定时功能的时候,都有对应的clearTimeout以及clearInterval与之对应. 但是他们之间是有区别的! setTime ...

  5. asp IIS部署An error occurred on the server when processing the URL错误提示解决

    An error occurred on the server when processing the URL. Please contact the system administrator.If ...

  6. 在CentOS6.0上安装Oracle 11gR2 (11.2.0.1)以及基本的配置(一)

    首先安装CentOS6.0   就不用说了.安装即可.唯一需要注意的就是后面Oracle 11G Installation guide中的Checking the Software Requireme ...

  7. SQL输出矩阵

    数据库环境:SQL SERVER2008R2 需求:用SQL实现如下2个图中的矩阵.            图1和图2都是行列转换的另一个变形,下面直接贴上SQL脚本. 图1的SQL实现 /*利用系统 ...

  8. jQuery 如何设置input checkbox 更有效 prop()

    问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性 ...

  9. Quartz-2D绘图之图形上下文详解

    上一篇文章大概描述了下Quartz里面大体所包含的东西,但是对具体的细节实现以及如何调用相应API却没有讲.这篇文章就先讲讲图形上下文(Graphics Context)的具体操作. 所谓Graphi ...

  10. Linq 构造复杂Json 多表group by

    一个主表A(a1,a2),子表B(a1,b1,b2) ,想得到的结果是 [{a1,a2,Info [{b1,b2},{b1,b2},...}]] var list= from a in A join ...