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’,并写入新文档,删除原文档,并将新文档改名为原文档