背景:
    中午快餐,菜单吃了个遍,天天纠结于不知道点啥菜。 
    想起读书考试时,丢纸团选答案,于是用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. Access的转义字符

    Access中数据库转义字符规则: 插入.更新.=匹配 数据时,文本类型如用''括起来,中间可以有 ",*,%,[,],/,/,?,(,),{,}的任意组合,如要插入一个',需写''并在整个 ...

  2. linux导入导出数据库方法 windows导入导出数据库方法

    1.使用管理员账号(sys)登录查询字符集信息 第一步:查询LinuxOracle数据库的字符集 select userenv('language') from dual; 查询结果集可能为:AMER ...

  3. 前端(js/jquery) 日期和时间戳的转换

    一.JavaScript中获取当前时间的时间戳 方法一: var timestamp=Date.parse(new Date()); ====>结果是:1451441086000 注:这种方式精 ...

  4. ios专题 - GCD(1)

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...

  5. Python:字典

    #!/usr/bin/python3 #dict 字典 #字典是可变的 dict1 = {"name":"张三","age":22} pri ...

  6. Java之字符串学习

    java中String的使用十分频繁,是我们要学习的重点,在说String之前,我们要知道堆跟栈的区别. java中的数据类型分原生数据类型(primitived types)有八种(byte,cha ...

  7. PHP中的设计模式:单例模式(译)

    原文链接:http://coderoncode.com/2014/01/27/design-patterns-php-singletons.html 单例模式用于限制类实例化到单个对象,当整个系统只需 ...

  8. How To Read a Paper.md

    @ Titile How To Read a Paper.md @ author Keshav, 译 uuplusu   # 1. Intro    1. 读论文重要    2. 没有人教    3. ...

  9. GCC选项-Xlinker和-Wl区别

    写下给自己备忘,在一次使用GCC的过程中发现了原来传递给链接器ld可以同时使用Xlinker和Wl两种命令,这两个命令都可以正确传递给ld作为使用,现在总结下两者的区别. Xlinker后面跟的参数第 ...

  10. Django国际化注意事项

    涉及两部分内容: py/html文件国际化.外部js文件国际化 步骤 1. settings.py 激活相应的配置 2. 针对py文件,需要注意被翻译代码的编写方式 3. 针对html文件,需要注意被 ...