python自动化运维之路~DAY1

                      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表中找到相应的字符,但是由于计算机文件大小的计算单位是字节啊,一个字节仅仅能存下一个字符,所以就有了18的进度换算

二.字符串的使用

 

name = "my name is yinzhengjie"

 

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 yinzhengjie"

 

print(name)

 

print(name.expandtabs(tabsize=50)) #自定义tab的间隔打小,该处是指定tab的间隔是50个空格。

 

print('yinzhengjie'.find("e")) #在name这个字符串中查找含有name字样的索引,从左往右开始查找,将查找的第一个返回出来,也就是最靠左边的那个

 

print('yinzhengjie'.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('yinzhengjie_1'.isidentifier()) #判断是不是一个合法的标识符

 

print('yinzhengjie'.islower()) #判断前面的字符串是否都是小写

 

print('YINZHENGJIE'.isupper()) #判断前面的字符串是否都是大写

 

print('696'.isnumeric()) #判断该变量是否是一个十进制的数字

 

print(' '.isspace()) #判断前面的字符串是否是一个空格

 

print('My Name Is Yinzhengjie'.istitle()) #判断这个字符串的每个字母是否大写

 

print('Yinzhengjie'.isprintable()) #判断前面的字符串是否支持打印功能,一般字符串都是可以打印的。在linux中一切都是文件,一些tty,drive等终端文件是不能打印的,就可以用这个来判断,用途比较少

 

print('+'.join(['1','2','3'])) #将一个列表的信息追加到前面的字符串中

 

print('YINZHENGJIE'.lower()) #将大写变成小写

 

print('yinzhengjie'.upper()) #将小写变成大写

 

print('\n yinzhengjie'.lstrip()) #只去掉左边的换行符或者空格

 

print(' linghunbaidu \n '.rstrip()) #只去掉左边和右边的换行符或者空格

 

print(' yinzhengjie \n'.strip()) #去掉字符串左右两边的空格和换行符

 

print('-----')

 

passwd = str.maketrans("abclefghijklmnopqrstuvwxyz",'1234567890!@#$%^&*()_+-={}') #将前面的字符串后后面的数字和特殊字符一样匹配,对应的数字会转换成相应的字符。

 

print("yinzhengji111e".translate(passwd)) #将上面自定义的参数,合这里面的字符想对应,如果穿进去的参数没有对应的字符就不匹配。这个跟Linux的密码加密有点类似哟。

 

print('yinzhengjie'.replace('e','E',2)) #将字符串中的某个字符换成另外的一个字母或者数字(字符),后面可以匹配相应的次数,依次从左往右开始匹配。

 

print('yin zheng jie'.split()) #将字符串按照空格分成一个列表

 

print('1+2+3+4+5'.split('+')) #用“+”作为分隔符,将其变成一个列表,如果不指定的话是以默认以空格分隔符的,例子如上

 

print('YinZhengJie'.swapcase()) #将字符串中的大小写互换

 

print('yin zheng jie'.title()) #将以空格为分隔符的所有的小写字母变大写

 

print('yinzhengjie'.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","#yin","Zheng","Jie"]
print(numbles)
numbles.reverse() #反转列表,就是讲列表的初始顺序调换一下
print(numbles)
strings = ["#yinzhengjie","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",["yinzhengjie","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 = ("yinzhengjie","alex","wudonhang","alex",) #定义一个元组,元组支持的方法列表都支持而且元组仅仅支持2中方法
print(names)
print(names.count("alex")) #统计alex字符串在该列表出现的次数
print(names.index("yinzhengjie")) #超照列表中的某个值所对应的索引ID,这个ID会和第一项匹配,如果出现了就直接匹配出来不会继续往下查找了

五.字典的使用

# 定义一个字典
info = {
'name':'yinzhengjie',
'heigh':'175',
'weight':'70',
'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' : 'yinzhengjie',
'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":"yinzhengjie"},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.5

 1 #!/usr/bin/env python
 2 #_*_conding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 
 6 
 7 TV_program = {
 8     '综艺节目':{
 9         '快乐大本营':{
10             '财务部':{  '主管':'谢娜'},
11             '技术支持':{  '主管':'何炅'},
12             '开发组':"吴昕"
13         },
14         '非诚勿扰':{
15             '主持人':{'主管':"孟非"},
16             "心理老师":"乐嘉"
17         },
18         '超级演说家':{
19             '主持人':["余声"],
20             '导师':["乐嘉"],
21             '导师1':["林志颖"]
22         }
23     },
24     "电视剧":{
25         "女医明妃传":{
26             '主演':['刘诗诗','霍建华','黄轩'],
27             "类型":['剧情','传记','历史'],
28             "备注":'卧槽,TMD要爱奇艺会员,老子不看了'
29         },
30         "灵魂摆渡":{
31             '主演':['于毅','刘智扬',"肖茵"],
32             "类型":'悬疑',
33             "备注":'已经更新好几年了,不要钱!'
34         }
35     },
36     "动漫":{
37         "火影忍者":{
38             "主演":["旋涡鸣人","佐助","小樱"],
39             "出品国家":"日本动漫",
40             "类型":"励志",
41             "备注":"卧槽!每周更新一集,要我看了10年都木有把他看完啊~有木有啊!"
42         },
43         "喜羊羊与灰太狼":{
44             "主演":['喜羊羊','美羊羊','懒羊羊'],
45             "出品国家":"中国",
46             "类型":"卧槽!卧槽!我说不出来~啥类型都有呢!",
47             "备注":"适合天真浪漫的小女孩看。越看越降低智商的动漫!"
48         }
49     }
50 
51 }
52 print(TV_program) #打印处整个字典的内容
53 print(TV_program.get('综艺节目').get("超级演说家").get("主持人")) #找出我是演说家的主持人
54 print(TV_program.get('电视剧').get("灵魂摆渡").get("类型")) #找出灵魂摆渡的电视剧的所属类型
55 print(TV_program.get("动漫").get("火影忍者").get("主演")[0]) #找出字典中火影忍者的主角。

       建议大家不要用中文在字典中,因为很容易出现中文字符英文字符混搭的问题,统一用成英文就方便了。我这样写是问了更加形象的列出了平时我喜欢看电视节目的一小部分。说实话就是更接地气一点的啦~类似的大家在练习的

时候可以写下公司的名称以及所属部门,主管之类的,也是一种对字典的联系,哈哈。

 

扩展:

有序字典是字典的一个子集,我们需要导入“collections”这个模块的“OrderedDict“这个方法来实现。最大的特点就是让字典变成有序的!我们以下面这段代码为例!

#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com

import  collections
dict = {}
dict =  collections.OrderedDict(dict)
dict["name"] = "尹正杰"
dict["age"] = "25"
dict["blog"] = "http://www.cnblogs.com/yinzhengjie/"
def print_dict():
    for k, v in dict.items():
        print(k, v)
print_dict()

这样就可以使得输出的结果按照你写入的顺序来记录了啦!

 

六.循环语句

for循环

跳过本次循环直接进入下一次循环:continue

1 for i in range(1,10):
2     if i<5:
3         continue
4     print("This number is %s" % i)

跳出整个循环:break

 

1 for i in range(1,10):
2     if i>5:
3         break
4     print("This number is %s" % i)

好了我们可以用for循环写一个简单的乘法表啦:

1 for i in range(1,10):
2     for j in range(1,i+1):
3         print(("%sx%s=%s\t")% (i,j,i*j),end="")
4         if j == i:
5             print("\n")
乘法表

 

 while循环:编写一个猜测年龄的小程序

 1 my_age = 25
 2 count = 0
 3 while count < 3:
 4     user_input = int(input("Guess how old I am:"))
 5 
 6     if user_input == my_age:
 7         print("Congratulations, you got it !")
 8         break
 9     elif user_input < my_age:
10         print("Oops,think bigger!")
11     else:
12         print("think smaller!")
13     count += 1  # 每次loop 计数器+1
14 else:
15     print("猜这么多次都不对,你个笨蛋.")

 

 

七.登陆脚本程序开发

 

登陆接口 环境要求 python3.5

输入用户名密码 用户名密码 在文件中取值
认证成功后显示欢迎信息 例如: 欢迎,alex! (用 字符串格式化输出)
输错三次后锁定 py程序关闭后 再次登陆显示 您的用户已经被锁定,alex! (用到了py文件处理知识)
支持多用户 (不能只有一个alex账户)

 

流程图如下:

  

 

脚本类容:

 我用发现用列表根本无法完成锁定用户的功能,究其原因,我怀疑是执行代码完毕后,系统会将该脚本的直接内存释放掉而没有修改脚本的内容。其他的还是可以实现的。

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 
 6 import sys
 7 login_info = {
 8     'yinzhengjie':'123',
 9     'wusanjiang':'666',
10     'manli':'321'
11 }
12 locked = ['manli']
13 retry = 0
14 surplus = 2
15 while retry < 3:
16     username = input('please enter your username:')
17     passwd = input("Please input a password:")
18     if username  in locked:
19         print("The account has been locked, please contact the administrator to lift restrictions!")
20         sys.exit()
21     else:
22         if username not in login_info:
23             print("sorry,the user name you entered does not exist")
24         elif username in login_info and passwd == login_info.get(username):
25                 print("Welcome to use this system %s" % username)
26                 sys.exit()
27         else:
28                 print('The three times of thse user will be locked, you have a %s chance,' % surplus)
29                 surplus -= 1
30                 retry += 1
31                 continue
32 locked.append(username)

 

这个问题有点小纠结,发现用列表和字典貌在同一个脚本中貌似无法实现锁定功能,于是我又自学了文件处理的方法,推出了2个版本,在执行之前要读取文件readme

Readme文件:
1.代码中的字典定义着用户的信息;
2.在执行该脚本的时候,在相同路径下必须存在”locked.txt“这个文件而且第一行必须有字符,而且不能有空行,不然脚本会报错;
3.请选择自己相应的代码在相应的环境中运行
 
locke d.txt文件内容:
alex

 

 

windows版本代码如下

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 
 6 #导入一个sys模块。因为我需要用这个模块的exit方法来终止当前脚本。
 7 import sys
 8 #导入getpass模块,用这个方法可以实现对密码的不输出的功能。
 9 import getpass
10 #定义一个字典,这个字典里面存放着用户的登陆信息。
11 login_info = {
12     'yinzhengjie':'123',
13     'wusanjiang':'666',
14     'manli':'321'
15 }
16 
17 retry = 0
18 #定义一个剩余次数提示,这个数字的变化会意味着执行不同的代码。
19 surplus = 2
20 #满足我给的变量的初值,就会执行一下的代码,这个数字是可以更改的哟~
21 while retry < 3:
22     # 提示用户输入用户名和密码。
23     username = input('please enter your username:')
24     passwd = getpass.getpass("Please input a password:")
25     #passwd = input("Please input a password:")
26     # 用with方法打开一个文件
27     with open("locked.txt", 'r', encoding="utf-8") as lock_check:
28         # 用一个for循环去读取文件中的每一行
29         for lock in lock_check.readlines():
30             # 去除掉每一行的空格或者换行符
31             lock = lock.split()
32     # 判断输入的用户名称是否在被锁定的名单中,如果在就执行以下的代码。
33     if username  in lock:
34         print("The account has been locked, please contact the administrator to lift restrictions!")
35         # 执行完毕上一行的代码就退出当前脚本
36         sys.exit()
37     # 这个的意思是如果发现输入用户名称没有在锁定的文件中,就执行以下的代码。
38     else:
39         # 如果输入的用户名称不再字典中,就执行以下的代码。
40         if username not in login_info:
41             print("sorry,the user name you entered does not exist")
42             sys.exit()
43         #如果用户名称都正确,就执行以下的代码。
44         elif username in login_info and passwd == login_info.get(username):
45                 print("Welcome to use this system %s" % username)
46                 sys.exit()
47         #如果以上的2个条件都不满足,就执行以下的代码。
48         else:
49                 #当第三次输入用户信息还不正确的时候就执行以下的代码。
50                 if surplus == 0:
51                     print("Your user has been locked, please contact the administrator to unlock!")
52                     #文件的另外一种打开方式,如果执行到这里,说明用户已经输入三次了,这里我们可以锁定该用户名称。
53                     f = open("locked.txt", "a", encoding="utf-8")
54                     f.write("\n")
55                     f.write(username)
56                     f.close()
57                     sys.exit()
58                 #前2次输入的时候需要执行的代码。
59                 else:
60                     print('The three times of thse user will be locked, you have a %s chance,' % surplus)
61                     surplus -= 1
62                     retry += 1
63                     continue

 

linux代码如下:

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 
 6 #导入一个sys模块。因为我需要用这个模块的exit方法来终止当前脚本。
 7 import sys
 8 #导入getpass模块,用这个方法可以实现对密码的不输出的功能。
 9 import getpass
10 #定义一个字典,这个字典里面存放着用户的登陆信息。
11 login_info = {
12     'yinzhengjie':'123',
13     'wusanjiang':'666',
14     'manli':'321'
15 }
16 
17 retry = 0
18 #定义一个剩余次数提示,这个数字的变化会意味着执行不同的代码。
19 surplus = 2
20 #满足我给的变量的初值,就会执行一下的代码,这个数字是可以更改的哟~
21 while retry < 3:
22     # 提示用户输入用户名和密码。
23     username = input('\033[35;1mplease enter your username:\033[0m') #输出的时候提示字符为紫色
24     passwd = getpass.getpass("\033[36;1mPlease input a password:\033[0m") #输出的时候提示字符为浅蓝色,且输入字符不显示到屏幕上。
25     #passwd = input("\033[36;1mPlease input a password:\033[0m")
26     # 用with方法打开一个文件
27     with open("locked.txt", 'r', encoding="utf-8") as lock_check:
28         # 用一个for循环去读取文件中的每一行
29         for lock in lock_check.readlines():
30             # 去除掉每一行的空格或者换行符
31             lock = lock.split()
32     # 判断输入的用户名称是否在被锁定的名单中,如果在就执行以下的代码。
33     if username  in lock:
34         print("The account has been locked, please contact the administrator to lift restrictions!")
35         # 执行完毕上一行的代码就退出当前脚本
36         sys.exit()
37     # 这个的意思是如果发现输入用户名称没有在锁定的文件中,就执行以下的代码。
38     else:
39         # 如果输入的用户名称不再字典中,就执行以下的代码。
40         if username not in login_info:
41             print("sorry,the user name you entered does not exist")
42             sys.exit()
43         #如果用户名称都正确,就执行以下的代码。
44         elif username in login_info and passwd == login_info.get(username):
45                 print("Welcome to use this system %s" % username)
46                 sys.exit()
47         #如果以上的2个条件都不满足,就执行以下的代码。
48         else:
49                 #当第三次输入用户信息还不正确的时候就执行以下的代码。
50                 if surplus == 0:
51                     print("\033[31;1mYour user has been locked, please contact the administrator to unlock!\033[0m")#提示字符颜色变为红色
52                     #文件的另外一种打开方式,如果执行到这里,说明用户已经输入三次了,这里我们可以锁定该用户名称。
53                     f = open("locked.txt", "a", encoding="utf-8")
54                     f.write("\n")
55                     f.write(username)
56                     f.close()
57                     sys.exit()
58                 #前2次输入的时候需要执行的代码。
59                 else:
60                     print('\033[32;1mThe three times of thse user will be locked, you have a %s chance,\033[0m' % surplus)#提示字符用黄色警醒用户!
61                     surplus -= 1
62                     retry += 1
63                     continue

如果,你真的是小白的话,看不懂文件处理也没关系,可以参考一下我另外一篇关于文件处理的博客:http://www.cnblogs.com/yinzhengjie/p/6269791.html

转载于:https://www.cnblogs.com/yinzhengjie/p/6163999.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值