python自动化运维之路~DAY1
一.文件大小单位单位换算
我们一起看一下下面的图:
没错,都是数字,而且这些数字都是二进制的数字,即:0,1
这些数字在咱们的眼睛里面看起来眼花缭乱的,不知道是吗什么东西,那么我们从生产环境中抓例子,想必大家都看过电影,听过音乐,玩过电子游戏,看过图片,也看过电子书之类的东西,这些东西
归根就地终究还是会存在一个文件中,这写文件的熟悉都会有文件的大小EB,PB,TB,GB,MB,KB等等,他们都是描述文件大小的不通单位,他们的进度都是1024;
即:
1 ExaByte = 1024 PetaBytes
1 PetaByte = 1024 TeraBytes
1 TeraByte = 1024 GigaBytes
1 GigaByte = 1024 MegaBytes
1 MegaByte = 1024 KiloBytes
1 KiloByte = 8 Kilobits
1 kilobit = 128 Bytes
1 Byte = 8 bits
那么大家知道这个单位换算是怎么来的吗?通过查阅资料,让我们一起学习下吧:
1946年,美国宾夕法尼亚大学电工系由莫利奇和艾克特领导,为美国陆军军械部阿伯丁弹道研究实验室研制了一台用于炮弹弹道轨迹计算的“电子数值积分和计算机”(ElectronicNumericalIntegratorandCalculator
简称ENIAC)。这台叫做“埃尼阿克”的计算机占地面积170平方米,总重量30吨,使用了18000只电子管,6000个开关,7000只电阻,10000只电容,50万条线,耗电量140千瓦,可进行5000次加法/秒运算。这个庞然大物于1946年2月15日在美国举行了揭幕典礼。这台计算机的问世,标志着电脑时代的开始。
以上是我从百度DOWN的2个表,是ascii表存的所有的字符,大家看最后的以为数字是多少?外国人发明了一个记数字的方法
用8个1就表示了255,也就是咱们所看到的,(这里我就不扯字符编码了,我主要讲一下这个8这个数字是怎么来的)
这个8个位置表示了255种情况,如果把这8个位置都用,巧妙的用0或者1去占相应的位置,就可以表示255中情况,而且每种情况
都表示不用的意思,他们会根据得到的数字去ascii表中找相应的字符。
例如:11111111这连续的8个1就表示
例如:00110000这8个数字就是十进制的48,回去ascii去找”0"这个数字。
Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范筹;
Byte意为“字节”,是计算机文件大小的基本计算单位;
这两者应用的场合不同。通常用bit来作数据传输的单位,因为物理层,数据链路层的传输对于用户是透明的,而这种通信传输是基于二进制的传输。在应用层通常是用byte来作单位,表示文件的大小,
在用户看来就是可见的数据大小。比如一个字符就是1byte,如果是汉字,则是2byte。
从上面的解释来看,计算机需要连续的8个数字,然后才能在ascii表中找到相应的字符,但是由于计算机文件大小的计算单位是字节啊,一个字节仅仅能存下一个字符,所以就有了1:8的进度换算
二.字符串的使用
name = "my name is rianley" print(name.capitalize()) #首字母大写 print(name.count("e")) #统计"e"这个字母在name变量中的字符串出现的次数 print(name.center(50,"=")) #打印50个字符,如果name这个变量中的字符串总个数不足50个,少出来的位置用“=”来填补,将name这个变量居中。 print(name.ljust(50,'*')) #打印50个字符,如果name这个变量中的字符串总个数不足50个,少出来的位置用“=”来填补,但是不是讲name这个字符串居中,而是打印整个字符串,不够50个字符串的用“*"号填补。 print(name.rjust(50,'-')) #这个和上面的相反,将整个字符串的占位打在右边,左边不足50个字符的用"-"填补 print(name.endswith("jie")) #判断一个变量是否以“jie”这个字符串结尾,如果是就返回Ture name = "my \tname is rianley" print(name) print(name.expandtabs(tabsize=50)) #自定义tab的间隔打小,该处是指定tab的间隔是50个空格。 print('
rianley
'.find("e")) #在name这个字符串中查找含有name字样的索引,从左往右开始查找,将查找的第一个返回出来,也就是最靠左边的那个 print('rianley'.rfind('e')) #从左往右开始查找,将查找到的最靠右的匹配结果的索引取出来 print(name[name.find("name"):]) #字符串和列表都有相同的功能,都可以支持切片,比如这个例子就是取“n”这个字符后面的所有字符 info = "I LOVE PLAY {A} and I love play {B}" print(info) print(info.format(A="ping-pong",B="basketball")) #以定义一个变量的形式传递一个参数到info的字符串中 print(info.format_map({'A':'football','B':'volleyball'})) #以字典的形式传递一个参数到info的字符串中 print('adA21'.isalnum()) #判断前面的字符串是否仅仅包含[a-z][A-Z][0-9] print('adA'.isalpha()) #判断前面的字符串仅仅包含[a-z][A-Z] print('1A'.isdecimal()) #判断前面的数字是否是十六进制的数字 print('2B'.isdigit()) #判断该字符串是否是一个整数 print('rianley_1'.isidentifier()) #判断是不是一个合法的标识符 print('rianley'.islower()) #判断前面的字符串是否都是小写 print('Rianley'.isupper()) #判断前面的字符串是否都是大写 print('696'.isnumeric()) #判断该变量是否是一个十进制的数字 print(' '.isspace()) #判断前面的字符串是否是一个空格 print('My Name Is Rianley'.istitle()) #判断这个字符串的每个字母是否大写 print('Rianley'.isprintable()) #判断前面的字符串是否支持打印功能,一般字符串都是可以打印的。在linux中一切都是文件,一些tty,drive等终端文件是不能打印的,就可以用这个来判断,用途比较少 print('+'.join(['1','2','3'])) #将一个列表的信息追加到前面的字符串中 print('RIANLEY'.lower()) #将大写变成小写 print('rianley'.upper()) #将小写变成大写 print('\n rianley'.lstrip()) #只去掉左边的换行符或者空格 print(' linghunbaidu \n '.rstrip()) #只去掉左边和右边的换行符或者空格 print(' rianley\n'.strip()) #去掉字符串左右两边的空格和换行符 print('-----') passwd = str.maketrans("abclefghijklmnopqrstuvwxyz",'1234567890!@#$%^&*()_+-={}') #将前面的字符串后后面的数字和特殊字符一样匹配,对应的数字会转换成相应的字符。 print("rianle1111y".translate(passwd)) #将上面自定义的参数,合这里面的字符想对应,如果穿进去的参数没有对应的字符就不匹配。这个跟Linux的密码加密有点类似哟。 print('rianley'.replace('e','E',2)) #将字符串中的某个字符换成另外的一个字母或者数字(字符),后面可以匹配相应的次数,依次从左往右开始匹配。 print('rianley cheng'.split()) #将字符串按照空格分成一个列表 print('1+2+3+4+5'.split('+')) #用“+”作为分隔符,将其变成一个列表,如果不指定的话是以默认以空格分隔符的,例子如上 print('RianleyCheng'.swapcase()) #将字符串中的大小写互换 print('rianley cheng'.title()) #将以空格为分隔符的所有的小写字母变大写 print('rianley'.zfill(50)) #总共需要打印50个字符,如果字符串不够的话前面用0占位
三.列表的使用
names = ["尹正杰","吴东航","李曼丽","沈建宇"] print(names) #取值整个列表 print(names.index("吴东航")) #查找出列表中的某个值所对应的索引ID print(names[names.index("吴东航")]) #根据列表中的索引ID返回所对应的值 print(names[0]) #取值第一个索引 print(names[0],names[3]) #取出第一个索引和第四个索引 print(names[1:3]) #从第二个索引开始取值,到第三个结束,改切片是顾头不顾尾 print(names[-1]) #取切片取值最后一个值,即倒着取 print(names[-3:-1]) #从倒数第三个开始取值,取到最后一个值。该切片也是顾头不顾尾哟 print(names[-3:]) #从倒数第三个数值开始取值,取到最后一个结束 names.append("龙帅") #追加一个新的值,也就是插入末尾 print(names) names.insert(1,"马荣廷") #在列表的第一个索引处插入一个新的值,前面的数字表示索引的位置,后面是对应该索引的值 print(names) names.remove("马荣廷") #删除值为“马荣廷”的值 print(names) del names[1] #删除列表中第二个索引所对应的值 print(names) names.pop(1) #删除第二个索引的值 print(names) names.pop() #如果不加数字,默认删除最后一个数值 print(names) names.clear() #清空列表 print(names) numbles = [0,1,2,3,4,5,6,7,8,9,"!","Alex","#Rianley","cheng"] print(numbles) numbles.reverse() #反转列表,就是讲列表的初始顺序调换一下 print(numbles) strings = ["#rianleycheng","wudonghang","shenjianyu","!wusangui"] strings.reverse() print(strings) strings.sort() #自动按照accsis编码排序,特殊字符会优先排序 print(strings) numbles.extend(strings) #扩展列表。可以将其他的列表追加到该列表来 print(numbles,strings) print(strings) del strings #删除列表 #print(strings) singer = ["zhoujielun","zhangjie","dengziqi","wanglihong","liyuchun",["rianleycheng","goodboy"],] singer_2 = singer.copy() #浅拷贝,只拷贝第一层的(即第一层的变量不包括子列表会被独立的开辟一块内存地址),如果列表里面镶嵌了子列表,那么第二层的列表里面的所有数值都会当成一个内存地址(即2个列表共用的同一个内存地址,都把内存指针指向了这个内存地址) print(singer) print(singer_2) singer[2] = "邓紫棋" singer[5][1] = "devops" print(singer) print(singer_2) actor = ["周星驰","成龙","杨幂","刘亦菲","胡歌",["吉泽明步","波多野结衣"]] import copy #导入模块,说道模块有个sys模块是c语音写的,所以我们在python的环境变量中是无法找到sys.py的模块的哟 actor_2 = copy.deepcopy(actor) #导入copy模块,用这个模块的深度复制已达到完全的拷贝 print(actor) print(actor_2) actor[4] = "huge" actor[5][1] = "canglaoshi" print(actor) print(actor_2) for i in actor: #逐个打印列表的每个值 print(i) num = [1,2,3,4,5,6,7,8,9] print(num[0:-1:2]) print(num[::2]) #步长是2,空一格打印一个 print(num[:]) #如果省略了数字就默认以0开头以-1结尾(即从头到尾的打印) person = ["name",["saving",10000]] p1 = copy.copy(person) #扩展3中浅拷贝的方式 p2 = person[:] p3 = list(person) print(p1) print(p2) print(p3) p1[0]='alxe' p2[0]='fengjie' p3[0]='wusanjiang' print(p1) print(p2) print(p3) 四.元组的使用 names = ("rianley","egon","wudonhang","egon",) #定义一个元组,元组支持的方法列表都支持而且元组仅仅支持2中方法 print(names) print(names.count("alex")) #统计alex字符串在该列表出现的次数 print(names.index("rianley")) #超照列表中的某个值所对应的索引ID,这个ID会和第一项匹配,如果出现了就直接匹配出来不会继续往下查找了
五.字典的使用 # 定义一个字典 info = { 'name':'rianley', 'heigh':'175', 'weight':'50', 'sex':'man', 'hobby':'basketball' } print(info.values()) #打印该字典的所有的value的值 print(info.keys()) #打印该字典的所有的keys值 print(info) print(info.get('name')) #查找key名称是name所对应的value,如果有就返回其所对应的value,如果没有的话就不输出 print("adress" in info) # 判断info这个字典中是否有adress这个key,如果没有就返回False,如果有就返回Ture,在python2.7中还可以这么写:info.has_key("adress") info['name'] = '程小航' #修改一个字典中的一个key所对应的value值 print(info) info['age'] = '25' #如果该字典没有对应的key,就是新增了一个key信息 print(info) del info["name"] # 删除该字典中的name这个key print(info) info.pop("heigh") #删除该字典中的heigh print(info) info.popitem() #随机删除该字典的一个Key信息 print(info) print(info.setdefault("name","宣城") ) #该方法可以去取该字典是否存name这个值,如果存在就会返回后面定义的值,如果不存在就回新建一个key值对 info.setdefault("place","上海") #该方法可以去字典去取相应的Key(place)值,如果没有取到(就说明没有定义这个key),也就是新建一个新的key值 print(info) a = { 'hobby':'sinsong', 'a' : 'rianley', 'c':'goodboy' } b = { 'hobby':'ping-pong', 1:100, 2:200 } a.update(b) #该方法可以将另外一个字典中的key和value更新到这个字典中,如果出现想用的key的话会用后面的字典中的value进行现有的value. print(a) c = dict.fromkeys([1,2,2,3,3,4,4],[444,{"name":"rianley"},555]) #这里面有2个列表,会自动将前面的列表去重并将去重后的每一个元素生成一个字典中所对应的key.然后将后面的列表当成一个内存地址同时赋值给没有key. print(c) c[3][1]["name"] ="程小航" #如果通过fromkeys定义生成的字典,修改其中任意一个key的值,那么所有的key的value都会跟着变化的. print(c) for i in info: #打印字典中的没有个key和value,这种方法是最高效的 print(i,info[i]) for k,v in info.items(): #这个循环会将字典先转换成一个列表,然后再打印出来,如果数据量较小的话和上面的循环的方法差不多,但是数据量比较大的话就麻烦了. print(k,v)
字典是一个很好玩的数据类型哟,字典中可以无限嵌套字典,但是你要明白每一层的字典中的key是千万不能重复的哟,由于字典是无序的,如果你定义了2个完全一样的key值的话,可能有一个key是无法显示的,
因为它会随机取一个key的值,而丢失了另外的一个相同key名称的值(这个是我在Pycharm测试出来的,共享给大家希望大家注意吧。)
下面我写了一个用字典记录平时我们喜欢看的电视节目名单,相信大家看了我上面的笔记,应该也能写出来这个名单的:(其实这就是一个简单的三级菜单)环境要求 python3.6
#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :rianley #blog:http://www.cnblogs.com/rianley TV_program = { '综艺节目':{ '快乐大本营':{ '财务部':{ '主管':'谢娜'}, '技术支持':{ '主管':'何炅'}, '开发组':"吴昕" }, '非诚勿扰':{ '主持人':{'主管':"孟非"}, "心理老师":"乐嘉" }, '超级演说家':{ '主持人':["余声"], '导师':["乐嘉"], '导师1':["林志颖"] } }, "电视剧":{ "女医明妃传":{ '主演':['刘诗诗','霍建华','黄轩'], "类型":['剧情','传记','历史'], "备注":'卧槽,TMD要爱奇艺会员,老子不看了' }, "灵魂摆渡":{ '主演':['于毅','刘智扬',"肖茵"], "类型":'悬疑', "备注":'已经更新好几年了,不要钱!' } }, "动漫":{ "火影忍者":{ "主演":["旋涡鸣人","佐助","小樱"], "出品国家":"日本动漫", "类型":"励志", "备注":"卧槽!每周更新一集,要我看了10年都木有把他看完啊~有木有啊!" }, "喜羊羊与灰太狼":{ "主演":['喜羊羊','美羊羊','懒羊羊'], "出品国家":"中国", "类型":"卧槽!卧槽!我说不出来~啥类型都有呢!", "备注":"适合天真浪漫的小女孩看。越看越降低智商的动漫!" } } } print(TV_program) #打印处整个字典的内容 print(TV_program.get('综艺节目').get("超级演说家").get("主持人")) #找出我是演说家的主持人 print(TV_program.get('电视剧').get("灵魂摆渡").get("类型")) #找出灵魂摆渡的电视剧的所属类型 print(TV_program.get("动漫").get("火影忍者").get("主演")[0]) #找出字典中火影忍者的主角。
建议大家不要用中文在字典中,因为很容易出现中文字符英文字符混搭的问题,统一用成英文就方便了。我这样写是问了更加形象的列出了平时我喜欢看电视节目的一小部分。说实话就是更接地气一点的啦~类似的大家在练习的
时候可以写下公司的名称以及所属部门,主管之类的,也是一种对字典的联系,哈哈。
扩展:
有序字典是字典的一个子集,我们需要导入“collections”这个模块的“OrderedDict“这个方法来实现。最大的特点就是让字典变成有序的!我们以下面这段代码为例!
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :rianley #blog:http://www.cnblogs.com/rianley #EMAIL:rianley@qq.com import collections dict = {} dict = collections.OrderedDict(dict) dict["name"] = "程小航" dict["age"] = "20" dict["blog"] = "http://www.cnblogs.com/rianley/" def print_dict(): for k, v in dict.items(): print(k, v) print_dict()
这样就可以使得输出的结果按照你写入的顺序来记录了啦!
六.循环语句
for循环
跳过本次循环直接进入下一次循环:continue
for i in range(1,10): if i<5: continue print("This number is %s" % i)
跳出整个循环:break
for i in range(1,10): if i>5: break print("This number is %s" % i)
好了我们可以用for循环写一个简单的乘法表啦:
for i in range(1,10): for j in range(1,i+1): print(("%sx%s=%s\t")% (i,j,i*j),end="") if j == i: print("\n")
while循环:编写一个猜测年龄的小程序
my_age = 25 count = 0 while count < 3: user_input = int(input("Guess how old I am:")) if user_input == my_age: print("Congratulations, you got it !") break elif user_input < my_age: print("Oops,think bigger!") else: print("think smaller!") count += 1 # 每次loop 计数器+1 else: print("猜这么多次都不对,你个笨蛋.")
七.登陆脚本程序开发
登陆接口 环境要求 python3.5
输入用户名密码 用户名密码 在文件中取值
认证成功后显示欢迎信息 例如: 欢迎,alex! (用 字符串格式化输出)
输错三次后锁定 py程序关闭后 再次登陆显示 您的用户已经被锁定,alex! (用到了py文件处理知识)
支持多用户 (不能只有一个alex账户)
流程图如下:
脚本类容:
我用发现用列表根本无法完成锁定用户的功能,究其原因,我怀疑是执行代码完毕后,系统会将该脚本的直接内存释放掉而没有修改脚本的内容。其他的还是可以实现的。
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :rianley cheng #blog:http://www.cnblogs.com/rianley import sys login_info = { 'rianley':'123', 'egon':'666', 'manli':'321' } locked = ['manli'] retry = 0 surplus = 2 while retry < 3: username = input('please enter your username:') passwd = input("Please input a password:") if username in locked: print("The account has been locked, please contact the administrator to lift restrictions!") sys.exit() else: if username not in login_info: print("sorry,the user name you entered does not exist") elif username in login_info and passwd == login_info.get(username): print("Welcome to use this system %s" % username) sys.exit() else: print('The three times of thse user will be locked, you have a %s chance,' % surplus) surplus -= 1 retry += 1 continue locked.append(username)
oldboy的第一次作业
#!/usr/bin/python ''' 功能介绍 登陆 ** 输入三次用户名错 记录主机地址,禁止他在登录 注:这儿 如果用户换机器还是 可以登录 ** 输入三次用户名正确,但是三次密码错,将记录用户名 锁定该用户,不允许他继续登录! (这儿当个用户被锁定,此账号无法登录,换其他的账户 可以继续登录) ** 配置文件 会自动生成!这儿有 异常处理,不至于打不开文件 而导致报错 ** PHP 是这个世界上 最好的语言 ''' __Author__ ='rianley cheng' import uuid class login: login_number = 3 local_mac = '' dic = { 'rianley': {'password': '123', 'count': 0}, 'rianley1': {'password': '123', 'count': 0}, 'rianley2': {'password': '123', 'count': 0}, } def validation(self): # 验证用户今天是否输入超过三次 mac = uuid.UUID(int=uuid.getnode()).hex[-12:] mac_num = ":".join([mac[e:e + 2] for e in range(0, 11, 2)]) #获取用户当前的mac 地址 try: #查看文件 是否已经存在,不存在,直接跳 login 方法 with open('config.txt', 'r') as f: #文件存在,比对信息,比对成功,则直接 exit() 比对不成功 则跳转 lines = f.read() # 读取所有行 if mac_num in lines.strip(): # 比对这个傻逼,今天是不是输入过3次,又来输入了玩 exit('对不起,你今天连续输入三次都未成功,系统怀疑你没有用户名 禁止你登录!如有问题请联系管理员申诉') else: self.login_mian() except IOError: self.login_mian() def get_macget_mac(self): mac = uuid.UUID(int=uuid.getnode()).hex[-12:] mac_num = ":".join([mac[e:e + 2] for e in range(0, 11, 2)]) f = open('config.txt', 'a') f.write(mac_num+'\n') f.close() def login_mian(self): while True: name =input('请输入用户名:') if not name in self.dic: print('该用户不存在,你还有%s次机会'%(self.login_number)) self.login_number-=1 if self.login_number<0: self.get_macget_mac() #记录主机信息 print('你输入三次都没对,系统默认你是不法分子!禁止你登录!而且还报警了,在不跑路,你要GG了') break continue else: try: with open('config.txt', 'r') as f: # 文件存在,比对信息,比对成功,则直接 exit() 比对不成功 则继续 lines = f.read() # 读取所有行 if name in lines:#判断用户是否已经登录三次,被锁定了 exit('此用户已被锁定,请联系管理员解锁') except IOError: pass password = input("请输入密码:") if password == self.dic[name]['password']: print('恭喜您登录成功!') print('您的登录账号是{name},密码为{password}'.format(name=name, password=password)) #输出用户登录信息 break else: self.dic[name]['count'] += 1 if self.dic[name]['count'] >2: print('密码输入次数超限制,已将该用户锁定,限制登录!') f = open('config.txt', 'a') f.write(name + '\n') f.close() break self.login_number-=1 print('密码不正确,你还能输入%s次'%(self.login_number)) continue obj= login() #实例化对象 obj.validation()