python文件的读写
一、文件读写几种模式总结:
读模式: r 打开不存在的文件会报错、不能写(不能调用write方法),可以读(能调用read方法)
写模式: w # 1、打开不存在的文件,会新建一个文件,但每次打开都会清空原有文件内容
# 2、不能读(不能调用read方法),可以写(能调用write方法)
追加模式 a # 1、打开不存在的文件,会新建,可以写(可以调用write方法)
# 2、不能读(不能调用read方法)
读写模式 r+ # 1、能写能读,但每次都是重头写入,会覆盖原有的文件内容
# 2、打开不存在文件的时候会报错
写读模式 w+ # 1、能读能写
# 2、但读不到内容,因为每次打开w先把文件内容清空
追加读模式 a+ # 1、能读能写
# 2、每次读的时候,文件指针是在文件末尾。如果需要重头读起,需要f.seek(0)将指针移到文件开始(注意在Python中,a或a+模式修改文件指针对于文件的写入没有影响,都会在结尾追加写入当文件写入数据后),在没有关闭文件前,此时写入的数据还在内存中,没有写入磁盘,当文件在其他地方打开的时候,是看不到新写入的数据,如果希望新写入的数据立即生效写入磁盘,需要用f.flush(),文件末尾用f.tell()
读
r = open('test.txt',encoding='utf-8') r.read()#读取所有内容,也可以使用循环,循环出来就是一行一行的内容 for i in r.read(): print() #这样就可以打印出每行的内容 readline():一次读取文件的一行。如果文件指针在文件开始位置,则读取的是第一行数据 readlines():读取文件的所有行,并且以list形式返回
6.文件操作小代码:修改文件
with 操作会自动调用close(),无需手动写关闭文件操作
第一种方式:全部读取文件的内容后修改其内容,将原有文件内容删除,然后将修改的内容直接复制写进去
第二种方式(推荐):创建一个新的空文件,将修改的内容写入到新文件后,再删除原有的旧文件,将新文件更名成旧文件名
第一种: f = open('nhy.txt','a+',encoding='utf-8') f.seek(0) result = f.read() content = result.replace('xiaolan','dalan')#替换 f.seek(0) f.truncate()#清空文件内容 f.write(content) f.close() f2 = open('nhy.txt','w') f2.write(content) 第二种: f = open('nhy.txt',encoding='utf-8') f2 = open('nhy2.txt','w',encoding='utf-8') for line in f: result = line.upper() f2.write(result) f.close() f2.close() import os os.remove('nhy.txt') os.rename('nhy2.txt','nhy.txt')
监控日志:
import time point = 0 while True: ips = {}#存放所有的ip地址 f = open('access.log',encoding='utf-8') f.seek(point) for line in f: if line.strip()!='':#判断是否不为空行 ip = line.split()[0] if ip not in ips: ips.setdefault(ip,1) else: ips[ip]+=1 # ips[ip]=ips[ip] + 1 point = f.tell()#记录文件指针的位置 for k,v in ips.items(): if v>=100: print('有问题的ip地址是%s'%k) f.close() time.sleep(60)
指针:
指针是读取文件的时候会标记位置,比如我执行两次打印文件内容,但是他只打印一次出来,为什么呢,因为文件指针的缘故,因为第一次已经把全部读出来了,指针已经在文章末尾了,所以第二次就读取不到内容,所以我们需要重新在读取到内容,就需要把指针移到我们想要的地方
print(r.read())
print(r.read())
#############
print(r.read())
r.seek(0)#这个就是指针的函数,这样第二次就可以读取到了
f.tell()#这个函数就是获取指针的位置,如果下一次读取文件想从这个地方开始读取,我们就记录下指针的位置,把指针摆放在这个位置,就可以从固定的位置开始读取文件
print(r.read())