1、文件指针
文件指针用来记录文件到底读到哪里
追加模式默认指针是在末尾
1)写入内容后,移动指针到文件最前面,并读出文件
f=open('test刘佳','a+',encoding='utf-8')#a模式默认指针是在末尾的 f.write('测试我写的') f.seek(0) #移动文件指针到最前面 print(f.read())
输出内容为整个文件的内容
2)写入内容,移动指针到最前面,再写入内容
f=open('test刘佳','a+',encoding='utf-8')#a模式默认指针是在末尾的 f.write('测试我写的') f.seek(0) #移动文件指针到最前面 f.write('来来来') #移动完文件指针,写的时候还是在文件末尾写
所以此时若查看文件发现,第二次写入的是在最末尾
2、练习1
练习之前先要懂以下两个知识点:
random函数:
print(random.randint(1,1000)) 生成1-1000以内的随机数
print('1'.zfill(4)) 针对字符串,不够4位就补0
要求:随机产生一些手机号,写到文件里面
import random
f=open('phone.txt','w') num=input('请输入你要产生的手机号个数:') for i in range(int(num)): start='1861235' random_num=str(random.randint(1,9999)) new_num=random_num.zfill(4) phone_num= start+new_num f.write(phone_num+' ') f.close() f=open(r'C:UsersacerDesktopstus.txt',encoding='utf-8') print(f.read())
手机号以1861235开头,后四位由随机数生成,生成的随机数不够4位的以0补齐。这个手机号是开头部分加上随机数,并将该结果写入文件中,再读出来
3、练习2
需求:监控日志,如果有攻击,就把IP加入黑名单
分析:1、打开日志文件 2、把IP地址拿出来 3、判断每一个IP出现的次数
直接循环一个文件对象,每次循环的是文件的每一行
import time point=0 #记录文件指针的位置 while True: all_ips = [] 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) # print(all_ip_set) for ip in all_ip_set: if all_ips.count(ip) > 50: print('应该加入黑名单的ip是%s'%ip) f.close() time.sleep(60) #暂停60秒
因为该文件中I出现,IP地址是在每行一开始的位置,所以循环文件,每次一行,并把每一行第一个字符串放到一个列表里,并对已经循环到的位置做标记,下次循环就从标记位置开始,避免每次都从头来。
4、自动关闭文件
with open('access.log','r+',encoding='utf-8') as f: for line in f: print(line)
5、文件强制写入
fw= open('username','w') fw.write('hh') fw.flush()#强制把缓冲区里面的数据写到磁盘上
6、修改文件
能直接修改文件中的内容,只能先把文件中内容读出来,修改后,将原本文件内容删除,然后将修改后的内容写进去
1)修改方式一
打开文件获取到所有内容,对内容进行修改,清空原来的文件内容,把新的文件内容写进去
将文件中的某字符串改为另外的字符串:
f=open('username','a+',encoding='utf-8') f.seek(0) all_str=f.read() new_str=all_str.replace('123456','78910') #把文件里的123456改为78910 f.seek(0) f.truncate()#清空文件内容 f.write(new_str) f.close()
在文件每行前面加上一个字符串str_:
f=open('username','a+',encoding='utf-8') f.seek(0) all_line='' for line in f: #循环文件每一行 new_line='str_'+line #每一行的最前面加上字符串'str' all_line=all_line+new_line f.seek(0) f.truncate() f.write(all_line) f.close()
2)修改方式二
a文件 a.txt
写一行写到b文件 a.txt.bak
删掉a文件,b文件名字改为a文件名
import os with open('words',encoding='utf-8') as fr, open('.words.bak','w',encoding='utf-8') as fw: for line in fr: new_line=line.replace('花','flower') fw.write(new_line) os.remove('words') os.rename('.words.bak','words')
原文档读,定义一个新文档写,循环每一行,将原文档里面的‘花’替换为‘flower’,并写入新文档,删除原文档,并将新文档改名为原文档