python文件操作
对文件的操作分三步:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件
3、关闭文件。
1 f=open('users.txt','r') #打开文件, 默认为只读模式 2 res = f.read()#读取文件内容 3 print(res) 4 f.close()#关闭文件
(一)打开文件
f=open('users.txt','r',encoding='utf-8') #默认为只读模式
with使用:在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,使用方式如下:
1 with open('users.txt','r') as f:#打开一个文件,把这个文件的句柄付给f 2 for line in f: 3 print(line) 4 5 with open('file.txt') as fr,with open('file_bak','w') as fw: #这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件 6 for line in fr:#循环file.txt中的每一行 7 fw.write(line)#写到file_bak文件中
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,后面通过此文件句柄对该文件操作,
打开文件的模式:
r 只读模式(默认),打开文件不存在的话,会报错 w 只写模式,不可读,不存在则创建,存在则会清空原来的文件内容 a 追加写模式,不可读,不存在则创建;存在则追加内容,不会清空原来的内容 r+ 读写模式 可读、可写,可追加,打开不存在的文件会报错 w+ 写读模式 使用w+,已经存在的文件内容会被清空,可读,但读的内容为空 a+ 追加读写模式 可读(注意读的时候先把文件指针移到文件头f.seek(0)),可写 不存在则创建,存在则只追加内容 "b"表示处理二进制文件(图片、歌曲、视频、压缩包....) rb wb ab rb+ wb+ ab+
(二) 读文件:三种方式 read()、 readlines()、 readline()
1 f=open('users.txt','r',encoding='utf-8') #默认为只读模式
2 # read()一次读完文件所有内容,返回一个字符串 3 print('第一次读:',f.read()) #获取到文件里面所有的内容,返回为字符串 4 print('第二次读:',f.read()) #返回为空,读不到东西 因为第一次读完文件后指针移动到了文件末尾 若想第二次读,前面加f.seek(0) 5 6 # readlines()获取到文件里面所有的内容,返回list,每一行内容为list的一个元素 7 print(f.readlines()) # ['123451234512345\n', 'heheheeh\n', 'iesidfksfjasi\n', 'oijeunlpihml'] 8 9 #readline()一次读一行,返回字符串 10 print(f.readline()) #123451234512345 11 print(f.readline()) #heheheeh
大文件时,读取文件高效的操作方法:
用read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放
f=open('users.txt',encoding='utf-8') # while True: # line=f.readline() # if line!='': # print('line:',line) # else: # print('文件内容读完了') # break #直接循环文件对象 ,不需要read for line in f: print(line)
(三)写文件:两种方式 write()、 writelines()
写入字符串时用write(),写入list用writelines()
1 f=open('users.txt','w',encoding='utf-8') #默认为只读模式 2 users=['key1,123\n','key2,456\n','key3,789\n'] 3 #white() 入参为字符串,所以将一个列表写到文件中,若用write(),需循环取出每个元素再写 4 for i in users: 5 f.write(i) 6 7 #writelines() 入参为list ,所以可直接将list写到文件中 8 f.writelines(users)
(四)修改文件内容
1、把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;2、把修改后的文件内容写到一个新的文件中
1 #方法一: 2 # (1)先读到文件内容 --替换--只写方式再次打开文件(清空原来内容)---写入新的内容 3 #需两次打开文件 4 f=open('file.txt',encoding='utf-8') 5 res=f.read().replace('一点','二点') #文件读完后,指针在最后面 6 f.close() 7 f=open('file.txt','w',encoding='utf-8') #只写模式打开文件,写入时会清空原来的内容 8 f.write(res) 9 f.close() 10 11 12 #(2)用truncate()方法清空文件内容 只需一次打开文件 13 f=open('file.txt','a+',encoding='utf-8') 14 f.seek(0) 15 res=f.read().replace('你','you') 16 f.seek(0) #read()之后,指针在文件末尾,需先移动指针到最前面 17 f.truncate() #清空原来文件内容 18 f.write(res) 19 f.flush() #不等缓冲区满,立即把内容写入磁盘 20 f.close()
1 #方法二:打开两个文件--把源文件中的内容读出修改,写到新文件中---删除源文件--将新文件名字修改成源文件名字 2 # 操作大文件时 一次操作一行 3 import os 4 f=open('file.txt',encoding='utf-8') 5 f2=open('file_bak.txt','w',encoding='utf-8') #w 文件不存在会新建 6 7 for line in f: #循环取出原文件中每一行 8 new_line=line.replace('我','me') #修改原文件 9 f2.write(new_line) #写入新文件 10 11 f.close() 12 f2.close() 13 14 os.remove('file.txt') #删除原文件 15 os.rename('file_bak.txt','file.txt') #将新文件名字修改成原文件名字 16 17 #用with同时打开多个文件 18 with open('file.txt') as fr,open('file_bak.txt','w') as fw: #with会自动判断什么时候关闭文件 可同时打开多个文件 19 for line in fr: 20 new_line = line.replace('我', 'me') 21 fw.write(new_line) 22 os.remove('file.txt') 23 os.rename('file_bak.txt','file.txt')
(五)文件操作练习:
1 #1.从日志里面找到1分钟之内访问超过200次的ip,加入黑名单 2 #2、每分钟都运行一次 3 4 # 1、读取文件内容,获取到ip地址 5 # 2、把每个ip地址和出现的次数保存到字典中 6 # 3、判断ip访问的次数是否超过200 7 # 4、加入黑名单 print出来 8 # 记住读到的位置,下次从这里开始读 9 10 import time 11 point=0 #文件指针初始位置 12 while True: 13 with open('access.log')as f: 14 f.seek(point) #第一次循环时,从文件头开始读 15 ip_all={} #定义字典,保存出现的ip及其次数 16 for line in f: #循环取文件里面每行数据 17 ip=line.split()[0] #按照空格分割,取第一个元素就是ip 18 if ip in ip_all: 19 ip_all[ip]+=1 20 else: 21 ip_all[ip]=1 22 point=f.tell() #记录本次读完后的指针位置 下次循环从这个位置开始读 23 24 for ip,count in ip_all.items(): 25 if count>200: 26 print('%s加入黑名单'%ip) 27 time.sleep(60) #定时运行 一分钟循环一次