详解Python读取yaml文件多层菜单


Posted in Python onMarch 23, 2019

需要用到的Python知识点

  1. Python的对象属性方法;
  2. 用到字典{key:value}值的提取;
  3. 列表的增加;
  4. if循环结合break的使用;
  5. yaml文件读取;

代码如下:

#!/usr/bin/python34
import sys,os,re,yaml,time
#reload(sys)
#sys.setdefaultencoding('utf-8') 

######################对input输入字符类型判断并转化#####################
def input_handle(s):
 if str.isdigit(s):     ###对输入是否是数字进行判断
  s = int(s)      ###如果输出的是个数字,则转化为整数类型
 return s
 
 # try:
 #  eval(s)       ###eval将字符串str当成有效的表达式来求值并返回计算结果
 # except NameError:     ###名称错误
 #  return s
 # except SyntaxError:     ###语法错误
 #  return s
 # else:
 #  return eval(s)
 

####################框架函数######################
def framework(province='',city='',county=''):
 os.system('cls')        ###清屏###
 print('''
******************************************************************
*                *
*      欢迎访问全国省市查询系统     *
*                *
******************************************************************


+-----------------------------------------------------------------
|   省份: %s 
|
|   市(区): %s 
|
|   县(区): %s
+-----------------------------------------------------------------
''' % (province,city,county))
 
######################输出展示函数#################
def show(province_name='',city_name='',county_name=''):
 output= '''
******************************************************************
*                *
     美丽的%s %s %s
*       欢迎您        *
     这里的山美,水美,妹子更美      
*                *
****************************************************************** 
'''
 print(output % (province_name,city_name,county_name))


###################菜单第一层省份或直辖市输出函数#################
def province_show(province_list):
 
 ############申明全局变量####################
 global P_NAME
 global C_NAME
 global X_NAME
 global FLAG_M

 province_dict = {}   
 ############对省份或直辖市列表参数进行遍历并加上数字编号############### 
 for k,v in enumerate(province_list,1):
   province_dict[k] = v
   print('%d . %s' % (k,v) + '\t',end='')  ###加上end参数,取消默认换行###
   if k % 4 == 0:        ###按4列换行###
    print()
 print('\n================================================================')
 print('q : Exit')

 ###############键盘读入编号或省份,可以输入汉字#################
 province_index = input('请输入编号或省份 : ')

 ###############如果输入非空,对输入进行判断并转化类型###########
 if len(province_index) != 0:
  province_index = input_handle(province_index)

 if province_index == 'q':       ###如果输入为q,则退出程序###
  sys.exit(0)  
 elif province_index in province_dict.keys():   ###如果输入为数字编号,则从字典中获取具体省份或直辖市名称###
  P_NAME = province_dict[province_index]   ###对全局变量赋值省份名称###
 elif province_index in province_dict.values():  ###如果输入为具体省份,则从字典中获取具体省份或直辖市名称###
  P_NAME = province_index       ###对全局变量赋值省份名称###
 else:
  P_NAME = ''          ###输入其他字符,赋值全局变量为空### 

 while P_NAME:          ###全局变量不为空进行循环###
  framework(P_NAME,C_NAME,X_NAME)     ###调用框架###
  if type(yaml_dict[P_NAME]) is list:
   city_show(P_NAME)       ###调用城市函数,并传入省份值###
   if FLAG_M == 'b':       ###城市函数输入b,返回上一层,重新选择省份###
    break
  else:
   show(P_NAME)         ###调用输出展示函数### 
   time.sleep(5)
   P_NAME = ''
   break
 else:
  print('输入错误,请重新输入!')     ###P_NAME为空,即输入错误,重新输入###
  time.sleep(2)
 
##############菜单第二层城市输出函数#######################
def city_show(province_name):

 ############申明全局变量###############
 global P_NAME
 global C_NAME
 global X_NAME
 global FLAG_M
 
 city_name = ''          ###定义城市变量默认为空###
 city_list = yaml_dict[province_name]     ###定义赋值城市列表###
 city_dict = {}          ###定义城市编号和名称字典###
 city_county_dict = {}        ###定义地级市和下属区县字典###

 ############对城市列表参数进行遍历并加上数字编号############### 
 for k,v in enumerate(city_list,1):
  if type(v) is str:        ###直辖市只有二层菜单,第二层为直接的各区或县,值类型为具体字符###
   city_dict[k] = v        ###对直辖市下的区或县进行新字典赋值,方便查询和展示###
   print('%d . %s' % (k,v) + '\t',end='')  ###末尾加',',取消默认换行###
  elif type(v) is dict:       ###其他省份有三层菜单,第二层为各地级市,值类型字典###
   for kk,vv in v.items():      ###对地级市的字典进行遍历###
    city_dict[k] = kk      ###对其他省份下的地级市进行新字典赋值,方便查询和展示### 
    city_county_dict[kk] = vv    ###对二层地级市和三层县市重新赋值新字典###    
    print('%d . %s' % (k,kk) + '\t',end='') ###加上end参数,取消默认换行### 
  else:
   pass
    
  if k % 4 == 0:         ###按4列换行###
   print()
 print('\n================================================================')
 print('q : Exit b : Back')

 ###############键盘读入编号或区市,可以输入汉字#################
 city_index = input('请输入编号或区市 : ')
 
 ###############如果输入非空,对输入进行判断并转化类型###########
 if len(city_index) != 0:
  city_index = input_handle(city_index)

 if city_index == 'q':        ###如果输入为q,则退出程序###
  sys.exit(0)
 elif city_index == 'b':        ###如果输入为b,则返回上一层,重新选择省份或直辖市###
  (P_NAME,C_NAME,FLAG_M) = ('','','b')    ###全局变量P_NAME,C_NAME设置为空,FLAG_M设置为b,则返回上一层###
  return           ###直接返回,不进行函数以下的操作###
 elif city_index in city_dict.keys():     ###如果输入为数字编号,则从字典中获取具体城市名称###
  city_name = city_dict[city_index]    ###赋值地级市的名称,并对全局变量进行赋值###
  (P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'')
 elif city_index in city_dict.values():    ###如果输入为城市名称,则从字典中获取具体省份名称###
  city_name = city_index       ###赋值地级市的名称,并对全局变量进行赋值###
  (P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'')
 else:
  pass            ###如果输入其他字符,则不做任何操作###
 
 if city_name:          ###如果地级市名字不为空,即键盘输入为要求字符###
  if city_name in city_county_dict.keys():   ###判断是省份的地级市名字### 
   while C_NAME:        ###环境变量C_NAME不为空###
    framework(P_NAME,C_NAME,X_NAME)   ###调用框架函数,并将省份名字和地级市名字传入###

    ###调用三层区县显示函数,并传入具体变量###
    county_show(P_NAME,C_NAME,city_county_dict[city_name]) 
    if FLAG_N == 'b':      ###三层区县函数输入b,返回上一层,重新选择地级市###
     break
   else:
    print('输入错误,请重新输入!')   ###C_NAME为空,即输入错误,重新输入###
    time.sleep(2)
  else:           ###判断是直辖市的区或县名字###
   show(P_NAME,C_NAME)       ###调用输出展示函数### 
   time.sleep(5)
 else:            ###输入非要求字符,提示重新输入###
  print('输入错误,请重新输入!')
  time.sleep(2)
  
##############菜单第三层区县输出函数#######################
def county_show(province_name,city_name,county_list):

 ############申明全局变量####################
 global P_NAME
 global C_NAME
 global X_NAME
 global FLAG_N

 county_name = ''          ###定义三级区县变量默认为空###
 county_dict = {}          ##定义赋值区县字典###
 
 ############对区县列表参数进行遍历并加上数字编号############### 
 for k,v in enumerate(county_list,1):     
  if type(v) is str:        ###第三层为直接的各区或县,值类型为具体字符str###
   county_dict[k] = v       ###对区或县进行新字典赋值,方便查询和展示###
   print('%d . %s' % (k,v) + '\t',end='')  ###加上end参数,取消默认换行### 

  if k % 4 == 0:         ###按4列换行###
   print()
 print('\n================================================================')
 print('q : Exit b : Back')

 ###############键盘读入编号或区县,可以输入汉字#################
 county_index = input('请输入编号或区县 : ')

 ###############如果输入非空,对输入进行判断并转化类型###########
 if len(county_index) != 0:       
  county_index = input_handle(county_index)

 if county_index == 'q':        ###如果输入为q,则退出程序###
  sys.exit(0)
 elif county_index == 'b':       ###如果输入为b,则返回上一层,重新选择第二层地级市###
  (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,'','','b') ###全局变量C_NAME设置为空,FLAG_M设置为b,则返回上一层###
  return           ###直接返回,不进行函数以下的操作### 
 elif county_index in county_dict.keys():    ###如果输入为数字编号,则从字典中获取具体区县名称###
  county_name = county_dict[county_index]   ###赋值区县的名称,并对全局变量进行赋值###
  (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'')
 elif county_index in county_dict.values():   ###如果输入为区县名称,则从字典中获取具体区县名称###
  county_name = county_index      ###赋值区县的名称,并对全局变量进行赋值###
  (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'')
 else:            ###如果输入其他字符,则不做任何操作### 
  (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,'','')

 if county_name:          ###如果区县名字不为空,即键盘输入为要求字符###
  show(P_NAME,C_NAME,X_NAME)      ###调用输出展示函数### 
  time.sleep(5)
 else:
  print('输入错误,请重新输入!')     ###输入非要求字符,提示重新输入###
  time.sleep(2)
 


##########################################主程序###############################

###############读取yaml格式文件#######################
fd = open(r'G:\sicps\test\pro',encoding='utf-8')
yaml_dict = yaml.load(fd)

###############定义全局变量###########################
P_NAME = ''            ###省份或直辖市全局变量###
C_NAME = ''            ###各省地级市或直辖市区县的全局变量###
X_NAME = ''            ###各省地级市下的区或县 全局变量###
FLAG_M = ''            ###退出菜单第二层,返回上一层循环的变量###
FLAG_N = ''            ###退出菜单第三层,返回上一层循环的变量###

###############获取省份或直辖市的列表#################
prov_list = yaml_dict.keys()

###############主循环开始#############################
while True:
 framework(P_NAME,C_NAME,X_NAME)      ###调用框架函数,显示初始状态###
 province_show(prov_list)       ###调用第一层省份或直辖市输出函数###

以上所述是小编给大家介绍的Python读取yaml文件多层菜单详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python入门之三角函数全解【收藏】
Nov 08 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
python3中eval函数用法使用简介
Aug 02 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
python绘制彩虹图
Dec 16 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
详解Python数据分析--Pandas知识点
Mar 23 #Python
详解Python基础random模块随机数的生成
Mar 23 #Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 #Python
Django异步任务之Celery的基本使用
Mar 23 #Python
深入解析Python小白学习【操作列表】
Mar 23 #Python
Python基础之条件控制操作示例【if语句】
Mar 23 #Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 #Python
You might like
php获取文件大小的方法
2014/02/26 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
八大排序算法的Python实现
2021/01/28 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
python实现用户名密码校验
2020/03/18 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
类如何去实现接口
2013/12/19 面试题
linux面试题参考答案(5)
2016/11/05 面试题
兼职学生的自我评价
2013/11/24 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
大学运动会入场词
2014/02/22 职场文书
党员检讨书
2014/10/13 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
入股协议书范本
2014/11/01 职场文书
毕业生见习报告总结
2014/11/08 职场文书
乌镇导游词
2015/02/02 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书