欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python读取yaml文件多层菜单

程序员文章站 2022-05-15 11:34:07
需要用到的Python知识点 代码如下: ......

需要用到的python知识点

  1. python的对象属性方法;
  2. 用到字典{key:value}值的提取;
  3. 列表的增加;
  4. if循环结合break的使用;
  5. 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:\sicps\test\pro',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)                            ###调用第一层省份或直辖市输出函数###