zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    119. Pascal's Triangle II
    118. Pascal's Triangle
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    108. Convert Sorted Array to Binary Search Tree
    88. Merge Sorted Array
    83. Remove Duplicates from Sorted List
    70. Climbing Stairs
    陌陌面试经历
  • 原文地址:https://www.cnblogs.com/whiggzhaohong/p/5295760.html
Copyright © 2011-2022 走看看