• 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)#监控每分钟的日志
    
  • 相关阅读:
    编程的发展史及Python简介
    计算机的主要部件和组成
    编程二连
    数据库中的数据类型
    数据库概念和基本操作(mysql的操作)
    并发编程之协程
    并发编程之多线程
    网络编程之socket编程
    并发编程之多进程
    网络编程之网络协议
  • 原文地址:https://www.cnblogs.com/tudouxifan/p/9184953.html
Copyright © 2020-2023  润新知