Python如何获取yaml文件多层菜单
时间:2018-09-22
本文章向大家介绍Python如何获取yaml文件多层菜单,需要的朋友可以参考一下
需要用到的Python知识点
- Python的对象属性方法;
- 用到字典{key:value}值的提取;
- 列表的增加;
- if循环结合break的使用;
- yaml文件读取;
代码如下:
1 #!/usr/bin/python34 2 import sys,os,re,yaml,time 3 #reload(sys) 4 #sys.setdefaultencoding('utf-8') 5 6 ######################对input输入字符类型判断并转化##################### 7 def input_handle(s): 8 if str.isdigit(s): ###对输入是否是数字进行判断 9 s = int(s) ###如果输出的是个数字,则转化为整数类型 10 return s 11 12 # try: 13 # eval(s) ###eval将字符串str当成有效的表达式来求值并返回计算结果 14 # except NameError: ###名称错误 15 # return s 16 # except SyntaxError: ###语法错误 17 # return s 18 # else: 19 # return eval(s) 20 21 22 ####################框架函数###################### 23 def framework(province='',city='',county=''): 24 os.system('cls') ###清屏### 25 print(''' 26 ****************************************************************** 27 * * 28 * 欢迎访问全国省市查询系统 * 29 * * 30 ****************************************************************** 31 32 33 +----------------------------------------------------------------- 34 | 省份: %s 35 | 36 | 市(区): %s 37 | 38 | 县(区): %s 39 +----------------------------------------------------------------- 40 ''' % (province,city,county)) 41 42 ######################输出展示函数################# 43 def show(province_name='',city_name='',county_name=''): 44 output= ''' 45 ****************************************************************** 46 * * 47 美丽的%s %s %s 48 * 欢迎您 * 49 这里的山美,水美,妹子更美 50 * * 51 ****************************************************************** 52 ''' 53 print(output % (province_name,city_name,county_name)) 54 55 56 ###################菜单第一层省份或直辖市输出函数################# 57 def province_show(province_list): 58 59 ############申明全局变量#################### 60 global P_NAME 61 global C_NAME 62 global X_NAME 63 global FLAG_M 64 65 province_dict = {} 66 ############对省份或直辖市列表参数进行遍历并加上数字编号############### 67 for k,v in enumerate(province_list,1): 68 province_dict[k] = v 69 print('%d . %s' % (k,v) + 't',end='') ###加上end参数,取消默认换行### 70 if k % 4 == 0: ###按4列换行### 71 print() 72 print('n================================================================') 73 print('q : Exit') 74 75 ###############键盘读入编号或省份,可以输入汉字################# 76 province_index = input('请输入编号或省份 : ') 77 78 ###############如果输入非空,对输入进行判断并转化类型########### 79 if len(province_index) != 0: 80 province_index = input_handle(province_index) 81 82 if province_index == 'q': ###如果输入为q,则退出程序### 83 sys.exit(0) 84 elif province_index in province_dict.keys(): ###如果输入为数字编号,则从字典中获取具体省份或直辖市名称### 85 P_NAME = province_dict[province_index] ###对全局变量赋值省份名称### 86 elif province_index in province_dict.values(): ###如果输入为具体省份,则从字典中获取具体省份或直辖市名称### 87 P_NAME = province_index ###对全局变量赋值省份名称### 88 else: 89 P_NAME = '' ###输入其他字符,赋值全局变量为空### 90 91 while P_NAME: ###全局变量不为空进行循环### 92 framework(P_NAME,C_NAME,X_NAME) ###调用框架### 93 if type(yaml_dict[P_NAME]) is list: 94 city_show(P_NAME) ###调用城市函数,并传入省份值### 95 if FLAG_M == 'b': ###城市函数输入b,返回上一层,重新选择省份### 96 break 97 else: 98 show(P_NAME) ###调用输出展示函数### 99 time.sleep(5) 100 P_NAME = '' 101 break 102 else: 103 print('输入错误,请重新输入!') ###P_NAME为空,即输入错误,重新输入### 104 time.sleep(2) 105 106 ##############菜单第二层城市输出函数####################### 107 def city_show(province_name): 108 109 ############申明全局变量############### 110 global P_NAME 111 global C_NAME 112 global X_NAME 113 global FLAG_M 114 115 city_name = '' ###定义城市变量默认为空### 116 city_list = yaml_dict[province_name] ###定义赋值城市列表### 117 city_dict = {} ###定义城市编号和名称字典### 118 city_county_dict = {} ###定义地级市和下属区县字典### 119 120 ############对城市列表参数进行遍历并加上数字编号############### 121 for k,v in enumerate(city_list,1): 122 if type(v) is str: ###直辖市只有二层菜单,第二层为直接的各区或县,值类型为具体字符### 123 city_dict[k] = v ###对直辖市下的区或县进行新字典赋值,方便查询和展示### 124 print('%d . %s' % (k,v) + 't',end='') ###末尾加',',取消默认换行### 125 elif type(v) is dict: ###其他省份有三层菜单,第二层为各地级市,值类型字典### 126 for kk,vv in v.items(): ###对地级市的字典进行遍历### 127 city_dict[k] = kk ###对其他省份下的地级市进行新字典赋值,方便查询和展示### 128 city_county_dict[kk] = vv ###对二层地级市和三层县市重新赋值新字典### 129 print('%d . %s' % (k,kk) + 't',end='') ###加上end参数,取消默认换行### 130 else: 131 pass 132 133 if k % 4 == 0: ###按4列换行### 134 print() 135 print('n================================================================') 136 print('q : Exit b : Back') 137 138 ###############键盘读入编号或区市,可以输入汉字################# 139 city_index = input('请输入编号或区市 : ') 140 141 ###############如果输入非空,对输入进行判断并转化类型########### 142 if len(city_index) != 0: 143 city_index = input_handle(city_index) 144 145 if city_index == 'q': ###如果输入为q,则退出程序### 146 sys.exit(0) 147 elif city_index == 'b': ###如果输入为b,则返回上一层,重新选择省份或直辖市### 148 (P_NAME,C_NAME,FLAG_M) = ('','','b') ###全局变量P_NAME,C_NAME设置为空,FLAG_M设置为b,则返回上一层### 149 return ###直接返回,不进行函数以下的操作### 150 elif city_index in city_dict.keys(): ###如果输入为数字编号,则从字典中获取具体城市名称### 151 city_name = city_dict[city_index] ###赋值地级市的名称,并对全局变量进行赋值### 152 (P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'') 153 elif city_index in city_dict.values(): ###如果输入为城市名称,则从字典中获取具体省份名称### 154 city_name = city_index ###赋值地级市的名称,并对全局变量进行赋值### 155 (P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'') 156 else: 157 pass ###如果输入其他字符,则不做任何操作### 158 159 if city_name: ###如果地级市名字不为空,即键盘输入为要求字符### 160 if city_name in city_county_dict.keys(): ###判断是省份的地级市名字### 161 while C_NAME: ###环境变量C_NAME不为空### 162 framework(P_NAME,C_NAME,X_NAME) ###调用框架函数,并将省份名字和地级市名字传入### 163 164 ###调用三层区县显示函数,并传入具体变量### 165 county_show(P_NAME,C_NAME,city_county_dict[city_name]) 166 if FLAG_N == 'b': ###三层区县函数输入b,返回上一层,重新选择地级市### 167 break 168 else: 169 print('输入错误,请重新输入!') ###C_NAME为空,即输入错误,重新输入### 170 time.sleep(2) 171 else: ###判断是直辖市的区或县名字### 172 show(P_NAME,C_NAME) ###调用输出展示函数### 173 time.sleep(5) 174 else: ###输入非要求字符,提示重新输入### 175 print('输入错误,请重新输入!') 176 time.sleep(2) 177 178 ##############菜单第三层区县输出函数####################### 179 def county_show(province_name,city_name,county_list): 180 181 ############申明全局变量#################### 182 global P_NAME 183 global C_NAME 184 global X_NAME 185 global FLAG_N 186 187 county_name = '' ###定义三级区县变量默认为空### 188 county_dict = {} ##定义赋值区县字典### 189 190 ############对区县列表参数进行遍历并加上数字编号############### 191 for k,v in enumerate(county_list,1): 192 if type(v) is str: ###第三层为直接的各区或县,值类型为具体字符str### 193 county_dict[k] = v ###对区或县进行新字典赋值,方便查询和展示### 194 print('%d . %s' % (k,v) + 't',end='') ###加上end参数,取消默认换行### 195 196 if k % 4 == 0: ###按4列换行### 197 print() 198 print('n================================================================') 199 print('q : Exit b : Back') 200 201 ###############键盘读入编号或区县,可以输入汉字################# 202 county_index = input('请输入编号或区县 : ') 203 204 ###############如果输入非空,对输入进行判断并转化类型########### 205 if len(county_index) != 0: 206 county_index = input_handle(county_index) 207 208 if county_index == 'q': ###如果输入为q,则退出程序### 209 sys.exit(0) 210 elif county_index == 'b': ###如果输入为b,则返回上一层,重新选择第二层地级市### 211 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,'','','b') ###全局变量C_NAME设置为空,FLAG_M设置为b,则返回上一层### 212 return ###直接返回,不进行函数以下的操作### 213 elif county_index in county_dict.keys(): ###如果输入为数字编号,则从字典中获取具体区县名称### 214 county_name = county_dict[county_index] ###赋值区县的名称,并对全局变量进行赋值### 215 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'') 216 elif county_index in county_dict.values(): ###如果输入为区县名称,则从字典中获取具体区县名称### 217 county_name = county_index ###赋值区县的名称,并对全局变量进行赋值### 218 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'') 219 else: ###如果输入其他字符,则不做任何操作### 220 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,'','') 221 222 if county_name: ###如果区县名字不为空,即键盘输入为要求字符### 223 show(P_NAME,C_NAME,X_NAME) ###调用输出展示函数### 224 time.sleep(5) 225 else: 226 print('输入错误,请重新输入!') ###输入非要求字符,提示重新输入### 227 time.sleep(2) 228 229 230 231 ##########################################主程序############################### 232 233 ###############读取yaml格式文件####################### 234 fd = open(r'G:sicpstestpro',encoding='utf-8') 235 yaml_dict = yaml.load(fd) 236 237 ###############定义全局变量########################### 238 P_NAME = '' ###省份或直辖市全局变量### 239 C_NAME = '' ###各省地级市或直辖市区县的全局变量### 240 X_NAME = '' ###各省地级市下的区或县 全局变量### 241 FLAG_M = '' ###退出菜单第二层,返回上一层循环的变量### 242 FLAG_N = '' ###退出菜单第三层,返回上一层循环的变量### 243 244 ###############获取省份或直辖市的列表################# 245 prov_list = yaml_dict.keys() 246 247 ###############主循环开始############################# 248 while True: 249 framework(P_NAME,C_NAME,X_NAME) ###调用框架函数,显示初始状态### 250 province_show(prov_list) ###调用第一层省份或直辖市输出函数###
- 【Go 语言社区】解析Go语言编程中的struct结构
- centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建
- 【Go 语言社区】Golang 语言获取本机逻辑CPU数量的方法
- Data Guard搭建困境突围(一)(r10笔记第17天)
- Java基础-day07-知识点相关题-自定义数据类型;ArrayList
- windows10 tensorflow(二)原理实战之回归分析,深度学习框架(梯度下降法求解回归参数)
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- 最近的几个技术问题总结和答疑(九)(r10笔记第16天)
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
- 【Go 语言社区】Golang语言操作redis连接池的方法
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
- 关于Flashback的小测试(r10笔记第15天)
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载
- 【Go 语言社区】Golang语言获取系统环境变量的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-期货数据-COMEX库存数据
- ESP8266和ESP32配置(需使用ROS1和ROS2)
- SpringBoot+Gradle+ MyBatisPlus3.x搭建企业级的后台分离框架
- frp 内网穿透远程桌面(Windows 10)配置
- 你来讲讲AQS是什么吧?都是怎么用的?
- Angular单元测试里pipe的mock设计
- 亿级数据判断 bitmap-布隆过滤器
- centOS8 安装MySQL8(亲测)
- 聊一聊微信小程序包内容
- 全面分析 MySQL并发控制
- Flink History Server
- 几种定时任务(Timer、TimerTask、ScheduledFuture)的退出—结合真实案例【JAVA并发】
- gitlab内存消耗大,频繁出现502错误的解决办法
- Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
- Elasticsearch 通过Scroll遍历索引,构造pandas dataframe 【Python多进程实现】