溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python 讀寫一個配置文件的實例分解 (二)

發(fā)布時間:2020-06-18 03:14:17 來源:網(wǎng)絡(luò) 閱讀:547 作者:HiSea_Y 欄目:建站服務(wù)器

上次已經(jīng)進(jìn)行了圖解。本次將展示一些主要的函數(shù):

##################################### 1 服務(wù)器組展示函數(shù):sys_show() ####################

def sys_show(file):
    sys_zone_name = 'backend'  ### 搜索關(guān)鍵字, 系統(tǒng)組名稱 ###
    srv_zone_name = ''  ### 搜索關(guān)鍵字,服務(wù)器組的名稱 ,例如:Oracle ###
    svr_name = 'server'  ###搜索關(guān)鍵字,服務(wù)器關(guān)鍵字###

    srv_zone_names_list = []  ### 服務(wù)器組名稱sys_zone_name組成的列表 ###
    srv_zone_names_dict = {}  ### 服務(wù)器組名稱sys_zone_name組成的字典,返回該值 ###
    svr_zones_dict = defaultdict(list)  ### 各服務(wù)器組名稱(srv_zone_name)和對應(yīng)服務(wù)器詳細(xì)參數(shù)(svr_record_dict{})組成的字典 ,返回該值###

    svr_record_dict = OrderedDict()  ### 包含服務(wù)器詳細(xì)參數(shù)有序字典 ###
    svr_record_list = []  ### svr_record_dict{} 的列表形式###

    svr_name_flag = False  ### 標(biāo)記是否找到該服務(wù)組(srv_zone_name)的標(biāo)志###

    with open(file, mode='r', encoding='UTF-8') as cfg_file:
        for line in cfg_file.readlines():
            line = line.strip('\n')
            if re.match(sys_zone_name, line):  ###  系統(tǒng)組名稱 sys_zone_name 如果在line中 ###
                srv_zone_name = re.split('\s+', line)[1]  ###  取得 srv_zone_name值 ###
                srv_zone_names_list.append(srv_zone_name)  ###  將srv_zone_name值存入列表 srv_zone_names_list中 ###
                svr_name_flag = True  ### 找到 對應(yīng)的系統(tǒng) sys_zone_name ###
            elif svr_name_flag and re.match('\s+server', line):  ### 在該系統(tǒng) sys_zone_name下,如果存在svr_name關(guān)鍵字 ###
                svr_record_list = re.split('\s+', line)  ### 該行以 空格 為分隔符 將具體信息 存入 svr_record_list[]中 ###

                svr_record_dict = OrderedDict()
                ### 在定義新參數(shù)前,歸位svr_record_dict,,否則會使用下面的新參數(shù)覆蓋所有原先的賦值###

                svr_record_dict['server_name'] = svr_record_list[2]
                svr_record_dict['IP_address'] = svr_record_list[4]
                svr_record_dict['weight'] = svr_record_list[6]
                svr_record_dict['maxconn'] = svr_record_list[8]
                ###取出列表svr_record_list 的信息,存入svr_record_dict{}字典中###

                svr_zones_dict[srv_zone_name].append(svr_record_dict)  ### 將srv_zone_name 與 svr_record_dict關(guān)聯(lián) ###
            else:
                svr_name_flag = False

    for k, v in enumerate(srv_zone_names_list, 1):
        srv_zone_names_dict[k] = v  ###對srv_zone_names_list進(jìn)行新字典賦值###
        print('              \033[34m %d . %-6s 服務(wù)器組 \033[0m' % (k, v))  ###輸出 帶編號的 服務(wù)器組 名稱###

    return srv_zone_names_dict, svr_zones_dict  ###返回srv_zone_names_dict字典 和svr_zones_dict 字典###
#########################################################################################

效果圖:

Python 讀寫一個配置文件的實例分解 (二)

下面是服務(wù)器展示函數(shù):

#################################### 4 服務(wù)器展示函數(shù) srv_record_show () ################
def srv_record_show(srv_zone_name, svr_zones_dict):
    ############對sys名稱進(jìn)行遍歷并加上數(shù)字編號###########################
    print('\n================================================================================')
    print('(%s)服務(wù)器信息如下 : ' % srv_zone_name)
    print('%-5s %-18s %-18s %-18s %-18s' % ('id', 'name', 'address', 'weight', 'maxconn'))

    svr_detail = svr_zones_dict[srv_zone_name]
    for k, v in enumerate(svr_detail, 1):  ###用enumerate進(jìn)行unit_record展示###
        print('%-5s ' % k, end='')
        for kk, vv in v.items():
            print('%-18s' % vv, end='|')
        print()
    print('\n=========================================================================')
#########################################################################################

效果圖如下:

Python 讀寫一個配置文件的實例分解 (二)

#################################### 8 配置文件回寫函數(shù) wrt2cfg() #######################
def wrt2cfg(file, svr_zones_all_dict):
    newfile = '%s.new' % file  ###定義回寫的新文件###
    svr_name_flag = False

    ###同時開啟2個文件,分別進(jìn)行讀寫###
    with open(file, 'r', encoding='UTF-8') as read_file, open(newfile, 'w', encoding='UTF-8') as write_file:

        for line in read_file:
            if re.match('backend', line):  ###讀取read_file,匹配至backend行時###
                write_file.write(line)  ###將本行插入到write_file中。###

                srv_zone_name = re.split('\s+', line)[1]
                for srv_dict in svr_zones_all_dict[srv_zone_name]:  ###對svr_zones_all_dict字典進(jìn)行遍歷###
                    server_line = '\t server {server_name} IP {IP_address} weight {weight} maxconn {maxconn}\n'
                    write_file.write(server_line.format(**srv_dict))  ###將srv_zone_name下的server行插入到write_file###

                    svr_name_flag = True  ###讀取到read_file中以server開頭的行,將該行svr_name_flag標(biāo)記為真###
            elif svr_name_flag and re.match('\s+server', line):
                ###讀取read_file,匹配至server開頭的行時跳過,對write_file不做任何操作###
                pass
            else:
                write_file.write(line)  ###將read_file其他的行直接插入到write_file中###
                svr_name_flag = False  ###讀取read_file,未發(fā)現(xiàn)以server開頭的行時,將該行server_flag標(biāo)記為FALSE###
    print('\033[39m 配置文件 更新成功\033[0m')
    os.system('move %s %s.bak ' % (file, file))  ###對源文件read_file進(jìn)行備份###
    os.system('move %s %s' % (newfile, file))  ##對新生成的write_file進(jìn)行改名###
#########################################################################################
#################################### 9 更新服務(wù)器數(shù)據(jù)函數(shù) update_svr_dict()#############
def update_svr_dict (new_svr_dict,update_select_num) :
    old_select_num = update_select_num
    (new_svr_dict['server_name'], update_select_num) = name_filter(update_select_num)  ###對name檢查###
    if old_select_num == update_select_num :
        (new_svr_dict['IP_address'], update_select_num) = ipaddress_filter(update_select_num)  ###對IP檢查###
    if old_select_num == update_select_num :
        (new_svr_dict['weight'], update_select_num) = number_filter('權(quán)重值',update_select_num)  ###對權(quán)重檢查###
    if old_select_num == update_select_num :
        (new_svr_dict['maxconn'], update_select_num) = number_filter('最大連接數(shù)',update_select_num)  ###對最大連接數(shù)檢查###
    if old_select_num == update_select_num :
        print (new_svr_dict['server_name'], new_svr_dict['IP_address'], new_svr_dict['weight'], new_svr_dict['maxconn'])
    return (new_svr_dict,update_select_num)
#########################################################################################

主程序如下:

##################################主程序開始#############################################
if __name__ == '__main__':
    flag = True  ### 腳本運行的標(biāo)志 ###
    sys_zone_name_ky = 'backend'  ### 系統(tǒng)的 名稱 ###
    srv_zone_name_vl = ''  ### 服務(wù)器組的名稱 例如:Oracle
    sys_cfg_file = 'configuretion.cfg'  ###指定sys的配置文件###
    svr_zones_all_dict = {}  ### svr_zones_all_dict字典 記錄各服務(wù)器的詳細(xì)信息 ###
    srv_zone_all_names_dict = {}  ### svr_name_ky 字典(由svr_name_ky列表和 數(shù)字編號 組成的字典)###
    global_opt2 = ''
    srv_zone_name_vl_num = ''

    while flag:    ### 循環(huán)M ###
        os.system('cls')  ###清屏###
        print('\n \033[38m ================================================================')
        print('            \033[36m 歡迎使用 數(shù)據(jù)庫服務(wù)器 配置文件管理平臺:\033[0m')

        print('\033[32m ================================================================')
        print('''        \033[39m 1. 查詢具體服務(wù)器\033[0m
        \033[34m 2. 添加具體服務(wù)器\033[0m
        \033[39m 3. 修改服務(wù)器列表\033[0m
        \033[34m 4. 刪除服務(wù)器列表\033[0m
        \033[31m 0. 退出\033[0m ''')
        print('================================================================')

        select_num = input('\033[30m 請按 數(shù)字鍵(0~4) 選擇:\033[0m')

        ##################################### 0 退出 exit ###############################
        if select_num == '0':
            flag = False
            continue
        while select_num in ['1','2','3','4'] :    ### 循環(huán) 0 ###
            if select_num == '1':temp_vl = '查看'  #temp_vl 為下一步顯示對應(yīng)選定的操作而設(shè)置的臨時參數(shù)
            if select_num == '2':temp_vl = '添加'
            if select_num == '3':temp_vl = '修改'
            if select_num == '4':temp_vl = '刪除'
            old_select_num = select_num

            print('\n              %-8s ZONE 服務(wù)器組信息如下 : ' % sys_zone_name_ky)
            (srv_zone_all_names_dict, svr_zones_all_dict) = sys_show(sys_cfg_file)
            print('\033[32m ================================================================')

            input_content = input('\033[39;1m請輸入進(jìn)行\(zhòng)033[33;1m%s\033[0m操作的服務(wù)器組的編號或名稱' \
                                  '(返回主菜單,請輸入B or b):\033[0m' % temp_vl )
            ############################## 對輸入值進(jìn)行過濾 #############################
            (srv_zone_name_vl, tmp_flag) = content_filter(input_content, srv_zone_all_names_dict)
            if srv_zone_name_vl:  ###顯示對應(yīng) srv_zone 下的服務(wù)器列表###
                srv_record_show(srv_zone_name_vl, svr_zones_all_dict)

            if tmp_flag == False : break
            ##################################### 1 查詢服務(wù)器信息 ######################
            if select_num == '1': continue
            ##################################### 2. 更新服務(wù)器信息 #####################
            while select_num == old_select_num and srv_zone_name_vl:    ### 循環(huán)1 ###
                if select_num in [ '3', '4' ]:    ###判斷修改、刪除選項中輸入的服務(wù)器編號準(zhǔn)確性###
                    srv_zone_name_vl_num = input('\033[32;1m請輸入\033[33;1m%s\033[0m的服務(wù)器的編號,((N|n)返回上級菜單):\033[0m'% temp_vl)
                    if srv_zone_name_vl_num in ['N', 'n']: break
                    if len(srv_zone_name_vl_num) != 0:
                        srv_zone_name_vl_num = input_str2int(srv_zone_name_vl_num)
                    #####################指定具體的server編號進(jìn)行判斷#####
                    elif srv_zone_name_vl_num not in range(1, len(svr_zones_all_dict[srv_zone_name_vl]) + 1):
                        print('超出范圍,請重新輸入?。?!')
                        continue        ###srv_zone_name_vl_num不在在服務(wù)器組個數(shù)范圍之內(nèi),提示并重新選擇###
                if select_num in [ '2','3' ]:    ###添加和修改服務(wù)器時進(jìn)行的操作步驟:更新服務(wù)器列表###
                    update_srv_dict = OrderedDict()
                    (update_srv_dict, select_num) = update_svr_dict(update_srv_dict,select_num)
                if select_num in [ '4' ]:
                    print(svr_zones_all_dict[srv_zone_name_vl][srv_zone_name_vl_num - 1]) #顯示被選中刪除的服務(wù)器列表#
                if select_num == old_select_num :   ###如果在以上操作中沒有進(jìn)行取消操作,則選擇參數(shù)不會變化,維持原來的用戶操作。###
                    update_opt = input('(Y|y)\033[33;1m%s\033[0m此服務(wù)器,任意鍵取消:' % temp_vl)
                    if update_opt in ['y','Y']:
                        if select_num == '2':
                            svr_zones_all_dict[srv_zone_name_vl].append(update_srv_dict)
                        if select_num == '3':
                            svr_zones_all_dict[srv_zone_name_vl][srv_zone_name_vl_num - 1] =update_srv_dict
                        if select_num == '4':
                            del svr_zones_all_dict[srv_zone_name_vl][srv_zone_name_vl_num - 1]

                        wrt2cfg(sys_cfg_file, svr_zones_all_dict)
                        srv_record_show(srv_zone_name_vl, svr_zones_all_dict)
                        print('\033[33;1m%s\033[0m成功!' % temp_vl)
                else :    ###如果在添加、修改、刪除過程中,選擇了取消,則select_num=5 ,對應(yīng)操作皆被取消###
                    print("\033[33;1m%s\033[0m被取消"  % temp_vl)
                global_opt2 = input('(Y|y)繼續(xù)\033[33;1m%s\033[0m本組服務(wù)器,(N|n)返回重新選擇服務(wù)器組,(B|b)返回主菜單:' % temp_vl)
                ###以上所有操作完成后,根據(jù)用戶需求,修正select_num 數(shù)值,提示用戶下一步操作。###
                if global_opt2 in ['B', 'b']:       ### 遇到select_num =  '5'時,返回主菜單。###
                    select_num =  '5'
                    print("返回主菜單。")
                elif global_opt2 in ['N', 'n']:     ###用戶繼續(xù)選擇服務(wù)器組,繼續(xù)進(jìn)行對原來的操作select_num =  old_select_num,。###
                    select_num =  old_select_num
                    break
                else: select_num = old_select_num   ###在原來選擇的服務(wù)器組中,繼續(xù)進(jìn)行操作。###
    else:
        sys.exit('\033[36m 程序退出,歡迎使用,謝謝! \033[0m')
#########################################################################################

部分截圖如下:

Python 讀寫一個配置文件的實例分解 (二)

Python 讀寫一個配置文件的實例分解 (二)


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI