一、对文件的操作分为三步:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件
3、关闭文件
现有文件words
读模式r 写模式w 追加模式a
读写模式r+ 写读模式w+ 追加读模式a+
读模式 r
f = open('words','r',encoding='utf-8') #r 读模式 # print(f.read()) #读文件 # print(f.readline()) #读一行 # print(f.readlines()) #把文件的每一行放在一个list里面 ['今天有点凉快\n', '昨天非常的热\n', '123456\n', 'be careful'] f.write('hhhhh') #写入 报错 #读模式 #1 不能写 #2 文件不存在的话会报错
写模式 w
f = open('words','w',encoding='utf-8') #写模式 f.write('hhhhh') #打开一个存在的文件写内容,原来的内容被覆盖 f = open('names','w',encoding='utf-8') #写模式 f.write(‘hhhhh’) #打开一个不存在的文件,会新建一个文件,往里面写内容 print(f.read()) #读文件 报错 写模式 1 打开一个存在的文件写内容,会清空原来文件的内容,写入新的内容 2 打开一个不存在的文件,会新建一个文件,往里面写内容 3 不能读
追加模式 a
f = open('words','a',encoding='utf-8') f.write('hhhhh') #打开一个存在的文件写内容,不会清空原来的内容,在末尾添加 f = open('names','w',encoding='utf-8') #文件不存在的话,新建一个文件 print(f.read()) #读文件 报错 追加模式 a 1打开一个存在的文件写内容,不会清空原来的内容,在末尾添加 2 打开一个不存在的文件,会新建一个文件,往里面写内容 3 不能读
读写模式r+
f = open('words','r+',encoding='utf-8') f = open('word','r+',encoding='utf-8') #文件不存在,会报错 print(f.read()) #读文件 f.write('hhhhh') #写入 覆盖原来内容
写读模式w+
f = open('words','w+',encoding='utf-8') f = open('word','w+',encoding='utf-8') #文件不存在,新建一个文件,可以写入 print(f.read()) #读文件,不能读 f.write('hhhhh') #写入 文件存在,清空原来的内容,写新内容
追加读模式a+
f = open('words','a+',encoding='utf-8') f = open('word','a+',encoding='utf-8') print(f.read()) #读不到文件 f.write('hhhhh') #写入
综上只要沾上r,文件不存在就会报错;只要沾上w,都会清空原来的内容;所以友好的方式是a+
文件指针
是用来记录文件到底读到哪里了,f.seek(0) 移动文件指针到最前面
f = open('words',encoding='utf-8') print(f.read()) print(f.readline()) #读不到东西,因为readline已经将文件指针指向文件末尾了
f = open('words','a+',encoding='utf-8') print('read读的',f.read()) ##读不到东西,因为a+模式指针默认指向文件末尾 f.write('这是我写的') ##在文件末尾写入,可以写入
f = open('words','a+',encoding='utf-8') f.seek(0) print('read读的',f.read()) ##加入seek(0)后可以读到 f.write('这是我写的') ##在文件末尾写入
#a+ 文件不存在可以创建一个文件,文件存在,在末尾添加内容,通过引用文件指针,可读可写。
with的使用
在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件
with open('words','a+',encoding='utf-8') as f: for line in f: print(line)
文件操作小练习,产生一批手机号码
#读写文件小练习 随机生成一批手机号 import random #print(random.randint(1,1000)) #随机产生1-1000的数字 # 手机号前面7位固定 1373806 (0001-9999) #print('22'.zfill(4)) #补0 0022 #1.随机产生一些手机号 #2.写到文件里 f = open('phone.txt','w') num = input('请输入你要产生的手机号个数:') for i in range(int(num)): #产生的数字是str类型,转换成int start = '1373806' random_num = str(random.randint(1,9999)) new_num = random_num.zfill(4) #补0 是字符串方法 phone_num = start + new_num f.write(phone_num+'\n') f.close()
1分钟 监控日志,加入黑名单
#监控日志,如果有攻击的,就把ip加入黑名单 #分析 #1,打开日志文件 #2,把ip地址拿出来 split #3 判断每一个ip出现的次数,如果大于50次的话,加入黑名单 # 4 每分钟读一次 import time point=0 #每次记录文件指针的位置 while True: all_ips = [] #存放所有ip地址 f = open(r'C:\Users\meng\Desktop\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秒