文件操作模式 :
- 只读模式 r
f=open('a.txt','r',encoding='utf-8')
不写时默认是r模式。可读不可写。
- 只写模式 w
f=open('a.txt','w',encoding='utf-8')
可写不可读,写时会将原始内容清空。
- 追加模式 a
f=open('a.txt','a',encoding='utf-8')
可写不可读,写时不会清空原来的内容。
- r+
f=open('a.txt','r+',encoding='utf-8')#写在前面
- w+
f=open('a.txt','w+',encoding='utf-8')
读时不会报错,但是读不到东西,会清空文件内容。
- a+
f=open('a.txt','a+',encoding='utf-8')
最好使得方法,可读可写。
r、r+打开不存在的文件都会报错,其它的模式会自动创建。
读文件:
result = f.read()#读所有东西
result = f.readlines()#['abc ', 'hjhsj ', '中文 ', 'hsuhsush ', '133434 ', 'ghsduwhue'] result = f.readline()#读一行
写文件:
f.write('tzy') f.writelines('gygyg')#可写列表,可写可循环的东西 f.writelines(['q','2'])#可写列表,可写可循环的东西,不可写数字
关闭文件:
f.close()
文件指针:
f.seek(0)
例子:
#每个在文件中占一行
names = ['小红','小绿','jshjddh'] names = ' '.join(names) f.writelines(names)
#将数字写入文件 l = [1,2,3,4] for i in range(len(l)): l[i] = str(l[i]) print(l) f.writelines(l)
清空文件内容:
f.truncate()#清空文件内容
大文件处理:
#大文件内容修改,直接循环文件,一行一行修改,修改完一行就放到新文件中,最后将旧文件删除,新文件重命名成原文件 with open('words.txt',encoding='utf-8') as fr,open('words_new.txt','w',encoding='utf-8') as fw: for line in fr: line = line.strip() if line: line = line.upper() fw.write(line+' ') import os os.remove('words.txt') os.rename('words_new.txt','words.txt')
with open('user.txt','a+',encoding='utf-8') as f:#文件对象,文件句柄 f.seek(0) # result = f.read() # print(result) for line in f:#处理大文件,直接循环文件 line = line.strip() if line: print(line)
文件操作练习:
监控日志,找出每分钟请求大于200次的ip
#1、监控日志,找到每分钟请求大于200次的ip加入黑名单 import time point = 0 while True: ips = {} with open('access.log',encoding='utf-8') as f: f.seek(point) for line in f: line = line.strip() if line: ip = line.split()[0] if ip in ips: ips[ip]+=1 else: ips[ip]=1 point = f.tell()#记录当前指针位置 for ip in ips: count = ips[ip] if count>=200: print('%s请求了%s次'%(ip,count)) time.sleep(60)