标签:日志文件 只读 二进制文件 [] else 小练习 它的 重复 10个
判断方法
# 非空即真、非0即
#不为空的话就是true,是空的话就是false
#只要不是0 就是 true,是0就是false
#布尔类型 True False
# print(bool(‘‘)) # print(bool(‘g‘)) name=input(‘name:‘).strip() if name:#输入不为空则真 print(‘输入不是为空‘) else: print(‘输入不能为空‘) #这些空数据都能识别 a=[] b={} c=0 f=tuple() e=‘‘ a=b=c=0#定义了3个变量,值都是0 可以用这么方法定义多个变量
交互变量:
#a,b交换值 a=1 b=2 c=None c=b b=a a=c b,a=a,b#交换a,b两个变量值 Python已经在底层引用第三方变量 b,a,c=a,c,b#对应交换 #不引用第三方变量,交换a,b值 a=a+b b=a-b a=a-b
深拷贝浅拷贝
l=[1,1,2,3,4,5,6,8]#循环删list里面的数据时,结果会不正确 for i in l:#循环l2 if i%2!=0: l.remove(i) print(l) #结果为:[1, 2, 4, 6, 8] l2=[1,1,2,3,4,5,6,8] print(id(l)) print(id(l2)) for i in l2:#循环l2,却删除l,这样就不会删除了l下标 if i%2!=0: l.remove(i) print(l) #结果为:[ 2, 4, 6, 8] import copy #浅拷贝,内存地址一样 #深拷贝,重新开辟内存空间 l2=copy.deepcopy(l)#深拷贝 l2=l#浅拷贝 #示例,浅拷贝 # lis=[1,1,2,3,4,5,6,8] # lis2=lis # print(id(lis)) # print(id(lis2)) # lis2.append(‘zhangliuliang‘) # print(lis)#lis会增加zhangliuliang #深拷贝 lis=[1,1,2,3,4,5,6,8] lis2=copy.deepcopy(lis) lis2.append(‘test‘) print(id(lis)) print(id(lis2)) print(lis)#lis不会增加zhangliuliang
集合
集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据
集合的作用:
1、它可以把一个列表中重复的数据去掉,而不需要你再写判断
2、可以做关系测试,比如说有两个班,一个性能测试班,一个是接口测试班的,想找出来既学习了性能又学习了接口测试的同学,就可以用集合
#集合天生去重 s=set()#空集合 s2=set(‘1231123fddf‘) print(s2) s3={1,1,3,4,5,6,7} d={‘k‘:‘v‘} #交集 并集 差集 #取交集 print(s2 & s3)#结果为空,因为s3元素为整型,s2为字符串 s3={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘} print(s2 & s3) print(s3.intersection(s2)) #并集,就是把两个集合合并在一起,然后去重 print(s2|s3) print(s2.union(s3)) #差集 就是去除某个集合相同的元素 s4={1,2,3} s5={1,4,6} print(s4-s5) print(s4.difference(s5)) #对称差集,去掉两集合都存在的元素 print(s4 ^ s5) print(s4.symmetric_difference(s5)) #print(s4.symmetric_difference_update(s5)) s4.add(‘ss‘) s4.pop()#随机删除一个元素 s4.remove(‘ss‘)#指定删除哪个 s4.update({1,2,3})#把另外一个集合加进来 s4.discard(1)#如果删除的元素存在则删除,如果不存在不做处理 s4.isdisjoint(s5)#如果有集合则False,没有交集则Flase #判读是否子集、父集 print(s4.issubset(s5)) # 判断s4是不是s5的子集 print(s4.issuperset(s5)) # 判断s4是不是s5的父集
文件:
对文件的操作分三步:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件
3、关闭文件。
文件的几种模式:
# 读模式 r 读写模式 r+ #1、不能写 #2、文件不存在的话会报错 # 写模式 w, 写读模式 w+ #1、文件不存在的话,会帮你新建文件 #2、打开一个已经存的文件,他会清空以前文件的内容 #3、不能读 # 追加模式 a, 追加读模式 a+ #文件末尾去增加内容 # 1、文件不存在的话,会帮你新建文件 # 2、打开一个已经存的文件,不会清空,末尾增加 # 3、不能读 1、打开文件的模式有: r,只读模式(默认)。 w,只写模式。【不可读;不存在则创建;存在则删除内容;】 a,追加模式。【不可读; 不存在则创建;存在则只追加内容;】 2、"+"表示可以同时读写某个文件 r+,【可读、可写;可追加,如果打开的文件不存在的话,会报错】 w+,【写读模式,使用w+的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】 a+,【追加读写模式,不存在则创建;存在则只追加内容;】 3、"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U 4、"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注 rb wb ab
文件基本操作:
f = open(‘pwd.txt‘,‘r‘,encoding=‘utf-8‘) #以只读方式打开一个文件,获取文件句柄,如果是读的话,r可以不写,默认就是只读,文件不存在会报错 #在python2中还有file方法可以打开文件,python3中file方法已经没有了,只有open frist_line = f.readline()#获取文件的第一行内容 print(frist_line)#打印第一行 res = f.read()#因为前面已经读取第一行,文件指针已经指向第二行,所以获取除了第一行剩下的所有文件内容 print(res) f.close()#关闭文件 # 结果: # 10123,123!qweQ # # 123,123!qwQW # 321,123@qwQw # 我
f = open(‘names‘,‘a+‘,encoding=‘utf-8‘) #打开文件,采用utf-8编码打开 f.seek(0) print(f.read()) #读文件 # print(f.readline()) #读取一行内容 # print(f.readlines()) #是把文件的每一行放到一个list里面 f.write(‘\n‘)#换行写入 f.write(‘天气真好‘)#写入 f.seek(0)#写入数据之后文件指针在最后一行,应该重新移动到第一行才能完全读取内容 print(f.read())
文件操作方法:
(1)
f = open(‘pwd.txt‘,‘a+‘,encoding=‘utf-8‘)#encoding参数可以指定文件的编码 f.seek(0)#把当前文件指针指向哪 print(f.readline())#读一行 f.readable()#判断文件是否可读 print(f.readable()) f.writable()#判断文件是否可写 print(f.writable()) f.encoding#打印文件的编码 print(f.encoding) f.read()#读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆 f.readlines()#读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆 f.tell()#获取当前文件的指针指向 print(f.tell()) f.write(‘你好‘)#写入内容 #f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中 f.seek(0) f.truncate()#清空文件内容 f.truncate(10)#截取10个字符 f.seek(0) print(f.read()) f.writelines([‘姓名‘,‘hwt‘])#将一个列表写入文件中 f.seek(0) print(f.read()) f.close()#关闭文件
(2)大文件时,读取文件高效的操作方法:
用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了
f = open(‘pwd.txt‘) for line in f: print(line)#这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存
(3)with使用:
在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,使用方式如下:
with open(‘pwd.txt‘,‘r‘,encoding=‘utf-8‘) as f:#打开一个文件,把这个文件的句柄付给f for line in f: print(line) with open(‘pwd.txt‘,encoding=‘utf-8‘) as fr, open(‘names‘,‘w‘,encoding=‘utf-8‘) as fw: #这个是多文件的操作,打开两个文件,fr是读pwd.txt,fw是新建一个names文件 for line in fr:#循环pwd.txt中的每一行 fw.write(line)#写到names文件中 print(line) #结果: # If I were a boy如果我是个男孩 # Even just for a day就算只是一天 # If I were a boy如果我是个男孩 # Even just for a day就算只是一天
with open(‘pwd.txt‘,‘r+‘,encoding=‘utf-8‘) as f: res = f.read() new_res = res.replace(‘我‘,‘me‘) #f.write(‘\n‘) f.write(new_res) f.seek(0) for line2 in f: print(line2) #结果: # If I were a boy如果我是个男孩 # Even just for a day就算只是一天 # 我 # If I were a boy如果me是个男孩 # Even just for a day就算只是一天 # me
with open(‘pwd.txt‘,‘r‘,encoding=‘utf-8‘) as f:#先看pwd文件数据 for line in f: print(line) with open(‘phones.txt‘,‘r‘,encoding=‘utf-8‘) as f:#在看phone文件数据 for line in f: print(line) with open(‘pwd.txt‘,encoding=‘utf-8‘) as fr, open(‘phones.txt‘,‘w+‘,encoding=‘utf-8‘) as fw: #这个是多文件的操作,打开两个文件,fr是读pwd.txt,fw是新建一个names文件 for line in fr:#循环pwd.txt中的每一行 new_line = line.replace(‘我‘,‘me‘) fw.write(new_line)#写到names文件中 with open(‘phones.txt‘,‘r‘,encoding=‘utf-8‘) as f:#输出替换后的phone数据进行对比 for line2 in f: print(line2) #结果: #pwd输出数据 # If I were a boy如果我是个男孩 # Even just for a day就算只是一天 # 我 # phone替换前数据 # 大家好 # 苹果 # 香蕉 # 快乐 #phone替换后数据,因为W有清空功能,所以原先数据清除了 # If I were a boy如果me是个男孩 # Even just for a day就算只是一天 # me
小练习:
#需求 # 1、监控日志,如果有攻击咱们的,就把ip加入黑名单 #分析: #1、打开日志文件 #2、把ip地址拿出来 #3、判断每一个ip出现的次数,如果大于100次的话,加入黑名单 #4、每分钟读一次 #直接循环一个文件对象的话,每次循环的是文件的每一行 #文件句柄 文件对象 import time point = 0 # 每次记录文件指针的位置 while True: all_ips = [] #存放所有的ip地址 f = open(‘access.log‘,encoding=‘utf-8‘) f.seek(point)#移动文件指针 for line in f: ip = line.split()[0] all_ips.append(ip) point = f.tell() #记录了指针的位置 all_ip_set = set(all_ips) # for ip in all_ip_set: if all_ips.count(ip)>50: print(‘应该加入黑名单的ip是%s‘%ip) f.close() time.sleep(60) #暂停60秒
标签:日志文件 只读 二进制文件 [] else 小练习 它的 重复 10个
原文地址:https://www.cnblogs.com/hwtfamily/p/8682469.html