1、文件各种模式的区别:
读模式 r ---1)不能写 2)打开不存在会报错
写模式 w --1)文件已存在,把文件清空了,再写 2)文件不存在,会新建文件,再写 3)不能读
追加模式 a 文件末尾增加内容 1)文件已存在,在末尾追加 写 2)文件不存在,新建,再写 3)不能读
读写模式:r+ 1)可以读,可以写。文件已存在,在末尾追加;文件不存在,报错
写读模式:w+ 2)不存在,新建;存在 清空后写; 可读可写
追加读模式:a+ 3)文件已存在,在末尾追加 写 ;文件不存在,新建,再写 ;可读但读不到东西
2、文件操作:
f.read() #读文件
f.readline() #读取一行内容
f.readlines() #是把文件的每一行放到一个list里面
f.write('双方都') #写入
3、操作大文件需要注意:
对于大文件,读取文件高效的操作方法:
用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了
with open('/Users/liuyan/Desktop/file.txt','r') as f:
for line in f:
print(line.strip())
4、方法tell() 和seek()的应用
需求:
1、监控日志,如果有攻击,就把ip加入黑名单
#分析:
#1、打开日志文件
#2、把ip地址拿出来
#3、判断每一个ip出现的次数,如果大于100次的话,加入黑名单
#4、每分钟读一次
#直接循环一个文件对象的话,每次循环的是文件的每一行
#文件句柄 文件对象
import time
point = 0 # 每次记录文件指针的位置
while True:
all_ips = [] #存放所有的ip地址
f = open('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秒
# for i in all_ips:
# if all_ips.count(i)>100:
# print('攻击的ip是%s'%i)
5、文件指针
# 用来记录文件到底读到哪里了
# f = open('naems','a+',encoding='utf-8')
# a模式的文件指针是在末尾的
# f.write('呵呵呵')
# f.seek(0) #移动文件指针到最前面
# f.write('鹏妹妹') #移动完文件指针之后,是只能读,写的时候还是在文件末尾写
6、
--------------------------------------
思考:
# f.close()
问:怎么查看知道文件没有被关闭? --无法查看,建议使用 with 方法使用文件,可以不用考虑关闭文件。
建议使用如下方式打开文件使用。
with open('/Users/liuyan/Desktop/file.txt','r') as f:
for line in f:
print(line.strip())
#确认:打印一行后会打印一空行? 如果不想多打印一空行呢?使用line.strip()
with open('/Users/liuyan/Desktop/file.txt','r') as fr:
with open('/Users/liuyan/Desktop/file_bak.txt','w') as fw:
for line in fr:
fw.write(line) #写入未多写入一空行