• Python自动化开发从浅入深-语言基础(一些心得)


      在PYTHON上课学习做作业的过程中,有一些心得:

    1、菜单的书写

      通常我们写菜单代码,会定义一个字串,然后print出来,或在字串中标注菜单数字选项,或在循环中用enumerate函数生成菜单数字。之后用if...else结构选择对应数字后,进行判断进入相应的处理程序。如下:

    menu ='''

    1.查看分组服务器信息

    2.输入批量管理命令

    3.输入批量上传命令

    4.退出系统

    '''

    print (menu)

     或者:

    menu = ['查看分组服务器信息','输入批量管理命令','输入批量上传命令','退出系统']

    for i,element in enumerate(menu):

      print(%d: %s' % (i, menu[i]))

    打印完菜单后,便是if...else结构了:

    select = input("请选择菜单》》》")

    if select == '1':

      “查看分组服务器信息”功能执行

    elif select == '2':

      "输入批量管理命令"功能执行

    elif select == '3':

      "输入批量上传命令"功能执行

    elif select == '4':

      退出系统

    else:

      pass

      

    但我们使用下面的方式,会更简练:将menu定义为字典 

     menu = {1:{"查看分组服务器信息":getServerGroupMsg},

          2:{"输入批量管理命令":batchCmd},
          3:{"输入批量下载命令":batchDownload},
          4:{"输入批量上传命令":batchUpload},
          5:{"退出系统":"quit"}}

      我们定义了2层字典,第一层的关键字key为菜单的数字选项,第二层字典的关键字key为菜单选项,第二层字典的值value为要执行函数名(这里函数名存放函数的地址),只有函数名加上括号(),函数才能执行功能。下面我们定义一个函数来使用这个menu字典。

    def selectMenu(menu):
        '''
        菜单选择
        :param menu: 菜单字典
        :return:
        '''
        select = {}#菜单选择字典
    
        while True:#进入菜单
            for k1,v1 in menu.items():#k1为菜单数字选项
                for k2,v2 in v1.items():#k2为菜单项,v2为选择该菜单所要执行的功能函数名
                    print("%s - %s"%(k1,k2))#显示菜单
                    select[k1] = v2 #生成执行功能的函数名字典
            s = input("------------------
    请选择数字:
    ")#菜单选择
            if s.isdigit():#判断是不是数字
                i = int(s)
                if i == len(select):#最后一项通常为退出系统菜单,q功能
                    path.log_other.info("系统退出")
                    break
                else:
                    if i == 1:#查看分组服务器信息
                        select[i](path.serverGroupPathMsgDict)#
                    elif i == 2:#输入批量管理命令
                        select[i](path.serverGroupPathMsgDict)
                    elif i == 3:#输入批量下载命令
                        select[i](path.serverGroupPathMsgDict)
                    elif i == 4:#输入批量上传命令
                        select[i](path.serverGroupPathMsgDict)

    2、文件操作:

      在python编程中,文件操作是经常要使用的,以下是自己写的一些函数常常可以用到:

         有这么一个文本数据文件:   

    #group1
    *zhaohong
    @172.16.45.5,22,root,1212
    *zhangsan
    @172.16.45.5,22,root,2323
    *lisi
    @172.16.45.5,22,root,12121
    *wangmou
    @172.16.45.5,22,root,232
    *lisan
    @172.16.45.5,22,root,122
    *zhaoyu
    @172.16.45.5,22,root,1221
    #group2
    *zhaohong1
    @172.16.45.15,22,root,12121
    *zhangsan1
    @172.16.45.15,22,root,1212
    *lisi1
    @172.16.45.15,22,root,1212
    *wangmou1
    @172.16.45.15,22,root,1212
    *lisan1
    @172.16.45.15,22,root,1212
    *zhaoyu1
    @172.16.45.15,22,root,1212

    在文件里面的数字前面都标注了#,*,@,其后是相应的数据,#是大类,其下是*,@数据。

    通过下面函数变为列表:

    def getFileList(filename):
        '''
        读取文件
        :param filename:需要读取的文件名
        '''
        retLine = []    #初始一个空列表,用户存放读入的文件内容
        with open(filename,'r') as f:
            for line in f:
                retLine.append(line)
    
        return retLine        #返回列表数据

    我们用上面函数返回的列表数据,生成一个字典数据:

    #得到:groupDict{'服务器组名':{'服务器名称'}:['IP','PORT','USER','PASSWORD']}
    def readServerGroupMsg(line):
        '''
        生成服务器分组字典信息
        :param line: 从文件读取后生成的服务器分组列表信息,由line生成字典
        :return:
        '''
        #创建有序字典
        DictSvr = collections.OrderedDict()
        groupDict = collections.OrderedDict()
        groupName = ''
    
        isOK = False#判断是否到一个组的尾部
        for i in range(len(line)):#遍历line
            s = line[i].strip()
            head = s[0]#取出头标记
            if head == '#':#分组名
                groupName = s[1:]#记录头
                serverNameList = []
                serverMsgList = []
            elif head == '*':#服务器名
                serverNameList.append(s[1:])#生成服务器名列表
            elif head == '@':#服务器信息
                sList = s[1:].split(',')
                serverMsgList.append(sList)#生成服务器信息列表
                isOK = True
    
            if isOK:
                for i in range(len(serverNameList)):#遍历服务器列表
                    DictSvr[serverNameList[i]] = serverMsgList[i]#以服务器名的key,以服务器信息为value写入临时字典
                groupDict[groupName] = deepcopy(DictSvr)#做深拷贝,这样可以保留前面的所拷贝的值
                isOK = False#设置为False便于进入下一个循环
                DictSvr.clear()#将临时字典清空,做下一次的累积
    
    
        return groupDict
  • 相关阅读:
    浅谈JS严格模式
    浅谈自记忆函数
    浅谈padding
    JS在if中的强制类型转换
    JS正则表达式从入门到入土(10)—— 字符串对象方法
    JS正则表达式从入门到入土(9)—— test方法以及它的那些坑
    JS正则表达式从入门到入土(8)—— REGEXP对象属性
    从零开始的vue学习笔记(四)
    从零开始的vue学习笔记(三)
    从零开始的vue学习笔记(二)
  • 原文地址:https://www.cnblogs.com/whiggzhaohong/p/5295760.html
Copyright © 2020-2023  润新知