詳解Python讀取yaml文件多層菜單
需要用到的Python知識(shí)點(diǎn)
- Python的對(duì)象屬性方法;
- 用到字典{key:value}值的提??;
- 列表的增加;
- if循環(huán)結(jié)合break的使用;
- yaml文件讀??;
代碼如下:
#!/usr/bin/python34
import sys,os,re,yaml,time
#reload(sys)
#sys.setdefaultencoding('utf-8')
######################對(duì)input輸入字符類(lèi)型判斷并轉(zhuǎn)化#####################
def input_handle(s):
if str.isdigit(s): ###對(duì)輸入是否是數(shù)字進(jìn)行判斷
s = int(s) ###如果輸出的是個(gè)數(shù)字,則轉(zhuǎn)化為整數(shù)類(lèi)型
return s
# try:
# eval(s) ###eval將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果
# except NameError: ###名稱(chēng)錯(cuò)誤
# return s
# except SyntaxError: ###語(yǔ)法錯(cuò)誤
# return s
# else:
# return eval(s)
####################框架函數(shù)######################
def framework(province='',city='',county=''):
os.system('cls') ###清屏###
print('''
******************************************************************
* *
* 歡迎訪問(wèn)全國(guó)省市查詢(xún)系統(tǒng) *
* *
******************************************************************
+-----------------------------------------------------------------
| 省份: %s
|
| 市(區(qū)): %s
|
| 縣(區(qū)): %s
+-----------------------------------------------------------------
''' % (province,city,county))
######################輸出展示函數(shù)#################
def show(province_name='',city_name='',county_name=''):
output= '''
******************************************************************
* *
美麗的%s %s %s
* 歡迎您 *
這里的山美,水美,妹子更美
* *
******************************************************************
'''
print(output % (province_name,city_name,county_name))
###################菜單第一層省份或直轄市輸出函數(shù)#################
def province_show(province_list):
############申明全局變量####################
global P_NAME
global C_NAME
global X_NAME
global FLAG_M
province_dict = {}
############對(duì)省份或直轄市列表參數(shù)進(jìn)行遍歷并加上數(shù)字編號(hào)###############
for k,v in enumerate(province_list,1):
province_dict[k] = v
print('%d . %s' % (k,v) + '\t',end='') ###加上end參數(shù),取消默認(rèn)換行###
if k % 4 == 0: ###按4列換行###
print()
print('\n================================================================')
print('q : Exit')
###############鍵盤(pán)讀入編號(hào)或省份,可以輸入漢字#################
province_index = input('請(qǐng)輸入編號(hào)或省份 : ')
###############如果輸入非空,對(duì)輸入進(jìn)行判斷并轉(zhuǎn)化類(lèi)型###########
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(): ###如果輸入為數(shù)字編號(hào),則從字典中獲取具體省份或直轄市名稱(chēng)###
P_NAME = province_dict[province_index] ###對(duì)全局變量賦值省份名稱(chēng)###
elif province_index in province_dict.values(): ###如果輸入為具體省份,則從字典中獲取具體省份或直轄市名稱(chēng)###
P_NAME = province_index ###對(duì)全局變量賦值省份名稱(chēng)###
else:
P_NAME = '' ###輸入其他字符,賦值全局變量為空###
while P_NAME: ###全局變量不為空進(jìn)行循環(huán)###
framework(P_NAME,C_NAME,X_NAME) ###調(diào)用框架###
if type(yaml_dict[P_NAME]) is list:
city_show(P_NAME) ###調(diào)用城市函數(shù),并傳入省份值###
if FLAG_M == 'b': ###城市函數(shù)輸入b,返回上一層,重新選擇省份###
break
else:
show(P_NAME) ###調(diào)用輸出展示函數(shù)###
time.sleep(5)
P_NAME = ''
break
else:
print('輸入錯(cuò)誤,請(qǐng)重新輸入!') ###P_NAME為空,即輸入錯(cuò)誤,重新輸入###
time.sleep(2)
##############菜單第二層城市輸出函數(shù)#######################
def city_show(province_name):
############申明全局變量###############
global P_NAME
global C_NAME
global X_NAME
global FLAG_M
city_name = '' ###定義城市變量默認(rèn)為空###
city_list = yaml_dict[province_name] ###定義賦值城市列表###
city_dict = {} ###定義城市編號(hào)和名稱(chēng)字典###
city_county_dict = {} ###定義地級(jí)市和下屬區(qū)縣字典###
############對(duì)城市列表參數(shù)進(jìn)行遍歷并加上數(shù)字編號(hào)###############
for k,v in enumerate(city_list,1):
if type(v) is str: ###直轄市只有二層菜單,第二層為直接的各區(qū)或縣,值類(lèi)型為具體字符###
city_dict[k] = v ###對(duì)直轄市下的區(qū)或縣進(jìn)行新字典賦值,方便查詢(xún)和展示###
print('%d . %s' % (k,v) + '\t',end='') ###末尾加',',取消默認(rèn)換行###
elif type(v) is dict: ###其他省份有三層菜單,第二層為各地級(jí)市,值類(lèi)型字典###
for kk,vv in v.items(): ###對(duì)地級(jí)市的字典進(jìn)行遍歷###
city_dict[k] = kk ###對(duì)其他省份下的地級(jí)市進(jìn)行新字典賦值,方便查詢(xún)和展示###
city_county_dict[kk] = vv ###對(duì)二層地級(jí)市和三層縣市重新賦值新字典###
print('%d . %s' % (k,kk) + '\t',end='') ###加上end參數(shù),取消默認(rèn)換行###
else:
pass
if k % 4 == 0: ###按4列換行###
print()
print('\n================================================================')
print('q : Exit b : Back')
###############鍵盤(pán)讀入編號(hào)或區(qū)市,可以輸入漢字#################
city_index = input('請(qǐng)輸入編號(hào)或區(qū)市 : ')
###############如果輸入非空,對(duì)輸入進(jìn)行判斷并轉(zhuǎn)化類(lèi)型###########
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設(shè)置為空,F(xiàn)LAG_M設(shè)置為b,則返回上一層###
return ###直接返回,不進(jìn)行函數(shù)以下的操作###
elif city_index in city_dict.keys(): ###如果輸入為數(shù)字編號(hào),則從字典中獲取具體城市名稱(chēng)###
city_name = city_dict[city_index] ###賦值地級(jí)市的名稱(chēng),并對(duì)全局變量進(jìn)行賦值###
(P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'')
elif city_index in city_dict.values(): ###如果輸入為城市名稱(chēng),則從字典中獲取具體省份名稱(chēng)###
city_name = city_index ###賦值地級(jí)市的名稱(chēng),并對(duì)全局變量進(jìn)行賦值###
(P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'')
else:
pass ###如果輸入其他字符,則不做任何操作###
if city_name: ###如果地級(jí)市名字不為空,即鍵盤(pán)輸入為要求字符###
if city_name in city_county_dict.keys(): ###判斷是省份的地級(jí)市名字###
while C_NAME: ###環(huán)境變量C_NAME不為空###
framework(P_NAME,C_NAME,X_NAME) ###調(diào)用框架函數(shù),并將省份名字和地級(jí)市名字傳入###
###調(diào)用三層區(qū)縣顯示函數(shù),并傳入具體變量###
county_show(P_NAME,C_NAME,city_county_dict[city_name])
if FLAG_N == 'b': ###三層區(qū)縣函數(shù)輸入b,返回上一層,重新選擇地級(jí)市###
break
else:
print('輸入錯(cuò)誤,請(qǐng)重新輸入!') ###C_NAME為空,即輸入錯(cuò)誤,重新輸入###
time.sleep(2)
else: ###判斷是直轄市的區(qū)或縣名字###
show(P_NAME,C_NAME) ###調(diào)用輸出展示函數(shù)###
time.sleep(5)
else: ###輸入非要求字符,提示重新輸入###
print('輸入錯(cuò)誤,請(qǐng)重新輸入!')
time.sleep(2)
##############菜單第三層區(qū)縣輸出函數(shù)#######################
def county_show(province_name,city_name,county_list):
############申明全局變量####################
global P_NAME
global C_NAME
global X_NAME
global FLAG_N
county_name = '' ###定義三級(jí)區(qū)縣變量默認(rèn)為空###
county_dict = {} ##定義賦值區(qū)縣字典###
############對(duì)區(qū)縣列表參數(shù)進(jìn)行遍歷并加上數(shù)字編號(hào)###############
for k,v in enumerate(county_list,1):
if type(v) is str: ###第三層為直接的各區(qū)或縣,值類(lèi)型為具體字符str###
county_dict[k] = v ###對(duì)區(qū)或縣進(jìn)行新字典賦值,方便查詢(xún)和展示###
print('%d . %s' % (k,v) + '\t',end='') ###加上end參數(shù),取消默認(rèn)換行###
if k % 4 == 0: ###按4列換行###
print()
print('\n================================================================')
print('q : Exit b : Back')
###############鍵盤(pán)讀入編號(hào)或區(qū)縣,可以輸入漢字#################
county_index = input('請(qǐng)輸入編號(hào)或區(qū)縣 : ')
###############如果輸入非空,對(duì)輸入進(jìn)行判斷并轉(zhuǎn)化類(lèi)型###########
if len(county_index) != 0:
county_index = input_handle(county_index)
if county_index == 'q': ###如果輸入為q,則退出程序###
sys.exit(0)
elif county_index == 'b': ###如果輸入為b,則返回上一層,重新選擇第二層地級(jí)市###
(P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,'','','b') ###全局變量C_NAME設(shè)置為空,F(xiàn)LAG_M設(shè)置為b,則返回上一層###
return ###直接返回,不進(jìn)行函數(shù)以下的操作###
elif county_index in county_dict.keys(): ###如果輸入為數(shù)字編號(hào),則從字典中獲取具體區(qū)縣名稱(chēng)###
county_name = county_dict[county_index] ###賦值區(qū)縣的名稱(chēng),并對(duì)全局變量進(jìn)行賦值###
(P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'')
elif county_index in county_dict.values(): ###如果輸入為區(qū)縣名稱(chēng),則從字典中獲取具體區(qū)縣名稱(chēng)###
county_name = county_index ###賦值區(qū)縣的名稱(chēng),并對(duì)全局變量進(jìn)行賦值###
(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: ###如果區(qū)縣名字不為空,即鍵盤(pán)輸入為要求字符###
show(P_NAME,C_NAME,X_NAME) ###調(diào)用輸出展示函數(shù)###
time.sleep(5)
else:
print('輸入錯(cuò)誤,請(qǐng)重新輸入!') ###輸入非要求字符,提示重新輸入###
time.sleep(2)
##########################################主程序###############################
###############讀取yaml格式文件#######################
fd = open(r'G:\sicps\test\pro',encoding='utf-8')
yaml_dict = yaml.load(fd)
###############定義全局變量###########################
P_NAME = '' ###省份或直轄市全局變量###
C_NAME = '' ###各省地級(jí)市或直轄市區(qū)縣的全局變量###
X_NAME = '' ###各省地級(jí)市下的區(qū)或縣 全局變量###
FLAG_M = '' ###退出菜單第二層,返回上一層循環(huán)的變量###
FLAG_N = '' ###退出菜單第三層,返回上一層循環(huán)的變量###
###############獲取省份或直轄市的列表#################
prov_list = yaml_dict.keys()
###############主循環(huán)開(kāi)始#############################
while True:
framework(P_NAME,C_NAME,X_NAME) ###調(diào)用框架函數(shù),顯示初始狀態(tài)###
province_show(prov_list) ###調(diào)用第一層省份或直轄市輸出函數(shù)###
以上所述是小編給大家介紹的Python讀取yaml文件多層菜單詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Python常用算法學(xué)習(xí)基礎(chǔ)教程
這篇文章主要學(xué)習(xí)Python常用算法,Python常用排序算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一2017-04-04
pytorch_pretrained_bert如何將tensorflow模型轉(zhuǎn)化為pytorch模型
這篇文章主要介紹了pytorch_pretrained_bert將tensorflow模型轉(zhuǎn)化為pytorch模型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Python reshape的用法及多個(gè)二維數(shù)組合并為三維數(shù)組的實(shí)例
今天小編就為大家分享一篇Python reshape的用法及多個(gè)二維數(shù)組合并為三維數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
如何不用安裝python就能在.NET里調(diào)用Python庫(kù)
這篇文章主要介紹了如何不用安裝python就能在.NET里調(diào)用Python庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Pytorch使用PIL和Numpy將單張圖片轉(zhuǎn)為Pytorch張量方式
這篇文章主要介紹了Pytorch使用PIL和Numpy將單張圖片轉(zhuǎn)為Pytorch張量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python+Tkinter實(shí)現(xiàn)經(jīng)典井字棋小游戲
Tkinter是內(nèi)置到Python安裝包中的,只要安裝好Python之后就能import?Tkinter,而且IDLE也是用Tkinter編寫(xiě)而成的。本文將用Tkinter編寫(xiě)經(jīng)典的井字棋小游戲,需要的可以參考一下2022-03-03
使用Puppeteer爬取微信文章的實(shí)現(xiàn)
這篇文章主要介紹了使用Puppeteer爬取微信文章的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

