Python讀取yaml文件多層菜單


需要用到的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)                            ###調用第一層省份或直轄市輸出函數###
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM