Python自动化四--文件操作
1.文件指针移动和读写
f = open('a.txt','w',ending='utf-8')
# w,w+ 清空文件内容
#r, r+ 指针在最前面
#a,a+ 指针在最后
f.seek(0)将指针移到文件最前面
f.read() #读取文件里面所有的内容,存成字符串,指针移到最后
f.readline() #读取一行
f.readlines() #读取文件里面所有的内容,返回的是一个list,每一行的内容放到一个list
f.write() #写一个字符串
f.writelines(abc) #写一个list
f.close()关闭文件
2.高效读写文件方法
由于CPU每次都是从磁盘中获取文件到内存中,再从内存中读取,因此频繁打开文件,性能不高。
f=open('file.txt',encoding='utf-8')
#直接循环文件对象,每次循环取的是文件的每行数据
for line in f:
print('line:',line)
文件读取-账号密码登录判断-小例子
all_users={} #定义全局变量,用于存储已有的用户名和密码
f.open('users.txt','a+',encoding='utf-8')#追加模式打开,文件指针移动到文件末尾
f.seek(0)#将文件指针移至文件开始处
for line in f: #循环文件对象,每次循环的就是每一行数据
line=line.strip()
line_list=line.split(,)
all_users[line_list[0]]=line_list[1]#将用户名,密码存到字典中
u=input('users:').strip()
p=input('password:').strip()
cp=input('repeated password:').strip()
#登录校验
for i in range(3):
if not u or not p:
print('账号,密码不能为空')
elif u not in all users:
print('用户不存在')
elif p!=all_users.get(u):
print('密码错误!')
else:
print('登录成功!')
break
#注册校验
for i in range(3):
if not u or not p:
print('账号,密码不能为空')
elif u in all_users:
print('该用户已经被注册!')
elif u not in all_users and cp==p:
info='%s,%s\n'%(u,p)
f.write(info)
break
f.close()
3.解决文件写入后,不能及时看到写入的内容问题
fw = open('nhy','w')
fw.write('sdfsdf')
fw.flush() #把缓冲区里面的数据立即写到磁盘上。
fw.close()
4.打开文件后立即关闭文件方法
#打开一个文件后立即关闭
with open('file','w')as f:
f.read()
f.write()
#同时打开两个文件
with open('file1,'w') as f1, open('file2','w') as f2 :
...
5.文件修改
方法一:简单粗暴
- 先获取到文件里面所有的内容
- 然后修改内容
- 清空原来文件里面的内容
- 重新写入
f = open('users.txt','a+')
f.seek(0)
all_data = f.read()
new_data = all_data.replace('123','python')
f.seek(0)
f.truncate() #清空文件内容
f.write(new_data)
f.flush()
f.close()
方法二:高效
- 先打开原来的文件,再打开一个空文件
- 循环处理原来文件里面每一行数据,处理完之后,写到新文件里面
- 把原来的文件删除,把新文件的名字改成原来文件的名字
import os
#1.同时打开两个文件,一个用于读,一个用于写,.word是隐藏文件
with open('words',encoding='utf-8') as fr, open('.words','w',encoding='utf-8') as fw:
#2.循环读取处理文件,并写到新文件
for line in fr:
if line:#判断这一行是否有数据
line = line.replace('你','you')#替换数据
fw.write(line)#写到新文件里面
#3.删除原来的文件,把新文件的名字改成原来文件的名字
os.remove('words')
os.rename('.words','words')
6.定时监控日志-小例子
- 如果一分钟之内某个ip访问超过100次,就把他的ip找出来,split,取第一个元素
- 找出所有的ip,统计次数
- 判断每个ip次数是否超过100次
- 记录文件指针,给下次读的时候用
- 等待60s,重新读取文件
#log文件内容格式
178.210.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /wp-includes/logo_img.php HTTP/1.0" 302 161 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"
178.210.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /blog HTTP/1.0" 301 233 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"
178.210.90.90 - - [04/Jun/2017:03:44:15 +0800] "GET /blog/ HTTP/1.0" 200 38278 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"
66.249.75.29 - - [04/Jun/2017:03:45:55 +0800] "GET /bbs/forum.php?
import time
point = 0 #存放的是文件初始的位置
while True:
with open('access.log',encoding='utf-8') as f:
f.seek(point)
ip_info = {} #存放ip和出现的次数
for line in f:
ip = line.split()[0]#获取IP
if ip in ip_info:
ip_info[ip] += 1
else:
ip_info[ip] = 1
point = f.tell() #获取当前文件指针的位置
for k in ip_info:
if ip_info.get(k)>=100:
print('该ip在攻击你%s'%k)
time.sleep(60)#监控每分钟的日志