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
'%(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.文件修改

方法一:简单粗暴

  1. 先获取到文件里面所有的内容
  2. 然后修改内容
  3. 清空原来文件里面的内容
  4. 重新写入
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()

方法二:高效

  1. 先打开原来的文件,再打开一个空文件
  2. 循环处理原来文件里面每一行数据,处理完之后,写到新文件里面
  3. 把原来的文件删除,把新文件的名字改成原来文件的名字
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.定时监控日志-小例子

  1. 如果一分钟之内某个ip访问超过100次,就把他的ip找出来,split,取第一个元素
  2. 找出所有的ip,统计次数
  3. 判断每个ip次数是否超过100次
  4. 记录文件指针,给下次读的时候用
  5. 等待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)#监控每分钟的日志
原文地址:https://www.cnblogs.com/tudouxifan/p/9184953.html