在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