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+'\n')
f.close()
f=open(r'C:\Users\acer\Desktop\stus.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’,并写入新文档,删除原文档,并将新文档改名为原文档