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("------------------\n请选择数字:\n")#菜单选择
        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

 

posted @ 2016-03-19 17:35  赵洪  阅读(390)  评论(0编辑  收藏  举报