一、文件操作
文件读写步骤:有一个文件,打开文件,操作文件读写文件,关闭文件。
python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
r | 只能读 | 报错 | - |
r+ | 可读可写 | 报错 | 是 |
w | 只能写 | 创建 | 是 |
w+ | 可读可写 |
创建 |
是 |
a | 只能写 | 创建 | 否,追加写 |
a+ | 可读可写 | 创建 |
否,追加写 |
这里假设在当前目录下有一个文件名为users.txt的文本文件,里面的数据如下:
yangfan,123123123 niudashen,123123123 xiaohong,123123123
1、文件基本操作
# 第一步:(以追加模式)打开文件 f=open('users.txt','a+') # 第二步:读取文件内容 print(f.read()) # 第三步:文件写操作 f.write('yangfan,4444\n') # 第三步:关闭文件 f.close()
2、文件读操作
# 读取整个文件内容 f=open('user.txt','r+') # 获取到文件里面所有的内容,返回的是字符串 print(f.read()) # 获取到文件里面所有的内容,放在一行的list里面 # ['yangfan,123123123\n', 'niudashen,123123123\n', 'xiaohong,123123123\n'] print(f.readlines()) # 一次获取一行数据,读取文件指针所在行,再次读时会从下一行开始 print(f.readline()) # yangfan,123123123 print(f.readline()) # niudashen,123123123 # 读写二进制文件:rb、wb、ab # "b"表示处理二进制文件,适用于图片、音乐、视频等等等等 res=open('333.jpg','rb') # 高效处理文件 #大文件时,用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话内存数据一多会非常卡,读取文件高效的操作方法,就是读一行操作一行,读过的内容就从内存中释放了。 #以下这种方式,line就是每行文件的内容,读完一行的话,就会释放一行的内存 f = open('file.txt') for line in f: print(line)
3、修改文件的两种方式
# 一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容; f = open(r'C:\Users\nhy\Desktop\file.txt',encoding='utf-8') res = f.read().replace('一点','二点') f.close() f = open(r'C:\Users\nhy\Desktop\file.txt',mode='w',encoding='utf-8') f.write(res) f.flush() #立即把缓冲区里面的内容,写到磁盘上 f.close()
# 第二种是把修改后的文件内容写到一个新的文件中。 with open('file.txt',encoding='utf-8') as f, open('file.txt.bak','w',encoding='utf-8') as f2: for line in f: new_line = line.replace('二点','一点') f2.write(new_line)
4、小练习:日志监控
要求:
1、要从日志里找到1分钟之内访问超过200次的ip
2、每分钟运行一次
提示:
1、读取文件内容,获取到IP地址
2、把每个ip地址存起来,列表或字典
3、判断ip访问的次数是否超过200次
4、超过的话ip加入黑名单
import time point = 0 #初始的位置 while True: ips = {} f = open('access.log',encoding='utf-8') f.seek(point) for line in f : #循环取文件每行数据 ip = line.split()[0] #按照空格分割,取第一个元素就是ip if ip in ips:# 判断这个ip是否存在 ips[ip] +=1#如果存在次数+1 else: ips[ip]=1#如果不存在ip的次数就是1 print(ips) point = f.tell()#记录文件指针位置 f.close() for ip, count in ips.items(): #同时取到 k v,#循环这个字典,判断大于200的 if count >=200: print('%s 加入黑名单'%ip) time.sleep(60)
二、集合(set)
集合(set)是一个无序不重复元素的序列。
集合天生可以去重,可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
#创建格式 parame = {value01,value02,...} 或者 set(value) #类型转换 l=[1,1,2,3,4,5] res=set(l) print(res) #{1, 2, 3, 4, 5}
1、集合的交集和并集
jihe=set() # 定义一个空的集合 xingneng=['一','二','三','四'] zidonghua=['一','二','五'] xn=set(xingneng) zdh=set(zidonghua) #取交集,两个集合都有的取出来 res1=xn.intersection(zdh) res2=xn&zdh #取并集,把两集合合并到一起,探后去重 res3=xn.union(zdh) # 差集,在xn中有,在zdh中没有的 res4=xn.difference(zdh) res5=xn-zdh #不对称差集,两个里面不重复的 res6=xn.symmetric_difference(zdh) res7=xn ^ zdh print(res1) print(res2) print(res3) print(res4) print(res5) print(res6) print(res7) # 结果是: # {'一', '二'} # {'一', '二'} # {'三', '五', '一', '四', '二'} # {'三', '四'} # {'三', '四'} # {'三', '五', '四'} # {'三', '五', '四'}
2、集合实例
import string l1=set(string.ascii_lowercase)#打印全部的英文字母 l2={'a','b','c'} #判断l2是不是l1的子集 print(l2.issubset(l1)) #有交集返回False,没有交集返回Ture print(l1.isdisjoint(l2))
3、集合中增加元素
# 集合中增加删除元素 l2.add('s')# 增加元素 l2.remove('a')# 删除指定元素 l2.pop()# 删除随机元素,因为没有下标,所以不能找下标删除
4、集合的循环
for l in l1: print(l)